How is tr1::reference_wrapper useful?

How is tr1::reference_wrapper useful?

本文关键字:wrapper useful reference is tr1 How      更新时间:2023-10-16

最近我一直在阅读Scott Meyers的一本优秀的高效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();

多布斯博士的这篇文章提供了一些信息。

希望这是正确的,并且有帮助。:)

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

  • 它允许引用的行为与其他简单对象类似——reference_wrapper<T>可以存储在STL容器中
  • 它有助于避免可怕的指针表示法——这是导致如此多分割错误的原因。尽可能用reference_wrapper<T>替换指向T的指针,用引用替换指针,用T.f()替换T->f()(当然,为了删除堆分配的对象,需要存储指针,但对于内存管理,Boost pointer Containers非常有用)

示例:

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#绑定引用