最近我一直在阅读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
是一个非常有用和简单的图书馆.在内部reference_wrapper
存储指向T的指针.但它公开的接口不包含任何指针表示法.
它允许引用表现得像其他简单对象 - reference_wrapper
可以存储在STL容器中.
它有助于避免可怕的指针表示法 - 导致如此多的分段错误.用替换指向T的指针reference_wrapper
被引用和,指针T->f()
被T.f()
尽可能(ofcourse指针需要存储删除堆分配的对象,但对内存管理升压指针容器是非常有用).
例:
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_; }; 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