tr1::reference_wrapper有什么用处?

21

最近我一直在阅读Scott Meyers的优秀书籍Effective C++。在他的一些技巧中,涵盖了来自TR1的一些特性,而我通过Boost了解了其中许多内容。

然而,有一项我确实没有认识到:tr1::reference_wrapper。

我应该如何使用tr1::reference_wrapper?何时使用它?

2个回答

17

据我所知,它类似于boost::ref。基本上是一个可以复制的引用。在绑定需要通过引用传递参数的函数时非常有用。

例如(使用boost语法):

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

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

fIncrementMyVariable();

这篇Dr. Dobbs文章提供了一些信息。

希望这对你有帮助。:)


好的,我了解boost::ref……我只是没有意识到TR1将这个功能命名为不同的名称——也就是说,并非tr1::ref。 - oz10
2
@ceretullis ref 是用于构造方法的,用于生成一个 reference_wrapper<T> 对象,其中 T 是一种类型。 - amit kumar
使用C++11,我认为我更喜欢使用lambda表达式:auto fIncrement = [&iVariable]{ Increment(iVariable);}; - Chris Drew

11
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#Bind-ref


1
“旧”的语法是:[A* a_; 相对于 boost::reference_wrapper<A> a_;] 和 [a_ = &a; 相对于 a_ = boost::ref(a);] [return *a_; 相对于 return a_;] 和 [B(A& a): a_(a) {} 相对于 B(A& a): a_(&a) {}] - Anton Andreev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接