【发布时间】:2010-09-16 15:51:33
【问题描述】:
最近我一直在阅读 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();
This Dr. Dobbs article 有一些信息。
希望这是正确的,并且有帮助。 :)
【讨论】:
auto fIncrement = [&iVariable]{ Increment(iVariable);};
reference_wrapper<T> 是一个非常有用且简单的库。 reference_wrapper<T> 在内部存储一个指向 T 的指针。但它公开的接口不包含任何指针表示法。
reference_wrapper<T> 可以存储在 STL 容器中。reference_wrapper<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
【讨论】: