tr1::Reference_Wrapper如何有用?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (29)

最近我一直在阅读Scott Meyers出色的Effective C ++书籍。在最后一个技巧中,他介绍了TR1的一些功能 - 我通过Boost知道其中的许多功能。

然而,有一个:tr1 :: reference_wrapper。

如何以及何时使用tr1 :: reference_wrapper?

提问于
用户回答回答于

据我所知,它就像boost :: ref一样。基本上,可以复制的参考。绑定到需要通过引用传递参数的函数时非常有用。

例如(使用boost语法):

void Increment( int& iValue )
{
    iValue++;
}

int iVariable = 0;
boost::function< void () > fIncrementMyVariable = boost::bind( &Increment, boost::ref( iVariable ));

fIncrementMyVariable();

这个Dr. Dobbs文章有一些信息。

用户回答回答于

reference_wrapper<T>是一个非常有用和简单的库。在内部reference_wrapper<T>存储一个指向T的指针。但是它暴露的接口不包含任何指针表示法。

  • 它允许引用像其他简单对象一样行为 - reference_wrapper<T>可以存储在STL容器中。
  • 它有助于避免可怕的指针表示 - 导致如此多的分段错误。用替换指向T的指针reference_wrapper<T>被引用和,指针T->f()T.f()尽可能(ofcourse指针需要存储删除堆分配的对象,但对内存管理升压指针容器是非常有用)。

例:

class A
{
    //...
};

class B
{
 public:
   void setA(A& a) 
   {
     a_ = boost::ref(a); // use boost::cref if using/storing const A&
   }
   A& getA()
   {
      return a_;
   }
   B(A& a): a_(a) {}
private:
   boost::reference_wrapper<A> a_; 
};

int main()
{
   A a1;
   B b(a1);
   A a2;
   b.setA(a2);
   return 0;
}

在这里我使用了引用包装器的boost实现,但是C ++ 0x标准也将拥有它。另见http://aszt.inf.elte.hu/~gsd/halado_cpp/ch11.html#Bind-ref

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问9 回答
  • 优惠活动秘书

    0 粉丝2 提问8 回答
  • 最爱开车啦

    8 粉丝503 提问6 回答
  • 富有想象力的人

    3 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券