最近,我一直在阅读 Scott Meyers 出色的Effective C++书籍。在最后一个技巧中,他介绍了 TR1 的一些功能——我通过 Boost 了解了其中的许多功能。
但是,有一个我绝对不认识:tr1::reference_wrapper。
我将如何以及何时使用 tr1::reference_wrapper?
最近,我一直在阅读 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();
这篇 Dobbs 博士的文章有一些信息。
希望这是正确的,并且有帮助。:)
reference_wrapper<T>
是一个非常有用且简单的库。在内部reference_wrapper<T>
存储一个指向 T 的指针。但它公开的接口不包含任何指针表示法。
reference_wrapper<T>
可以存储在 STL 容器中。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