最近我一直在阅读Scott Meyers的优秀Effective C++书。在最后一个提示中,他介绍了TR1的一些功能 - 我通过Boost知道了很多功能。
然而,有一个我绝对不认识:tr1 :: reference_wrapper。
我如何以及何时使用tr1 :: reference_wrapper?
答案 0 :(得分:16)
据我所知,就像boost :: ref一样。基本上,可以复制的参考。绑定到需要通过引用传递参数的函数时非常有用。
例如(使用boost语法):
void Increment( int& iValue )
{
iValue++;
}
int iVariable = 0;
boost::function< void () > fIncrementMyVariable = boost::bind( &Increment, boost::ref( iVariable ));
fIncrementMyVariable();
This Dr. Dobbs article有一些信息。
希望这是对的,也很有帮助。 :)
答案 1 :(得分:11)
reference_wrapper<T>
是一个非常有用且简单的库。在内部,reference_wrapper<T>
存储指向T的指针。但它公开的接口不包含任何指针表示法。
reference_wrapper<T>
可以存储在STL容器中。reference_wrapper<T>
,将引用指针替换为T->f()
T.f()
尽可能(需要存储指针以删除堆分配的对象,但用于内存管理Boost)指针容器非常有用。)示例:
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