最近我一直在阅读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();
这篇Dr. Dobbs文章提供了一些信息。
希望这对你有帮助。:)
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
auto fIncrement = [&iVariable]{ Increment(iVariable);};
- Chris Drew