21

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

但是,有一个我绝对不认识:tr1::reference_wrapper。

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

4

2 回答 2

17

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

例如(使用 boost 语法):

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

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

fIncrementMyVariable();

这篇 Dobbs 博士的文章有一些信息。

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

于 2008-10-11T06:26:39.513 回答
11

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

  • 它允许引用的行为与其他简单对象一样 -reference_wrapper<T>可以存储在 STL 容器中。
  • 它有助于避免可怕的指针符号——造成如此多的分段错误的原因。将指向 T 的指针替换为 a ,通过reference_wrapper<T>引用和任何可能的指针(当然需要存储指针以删除堆分配的对象,但对于内存管理,Boost Pointer Containers 非常有用)。T->f()T.f()

例子:

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

于 2009-06-18T08:05:43.933 回答