How is tr1::reference_wrapper useful?
How is tr1::reference_wrapper useful?
最近我一直在阅读Scott Meyers的一本优秀的高效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();
多布斯博士的这篇文章提供了一些信息。
希望这是正确的,并且有帮助。:)
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#绑定引用
相关文章:
- consteval wrapper vs. source_location
- OpenSSL fips in C++ wrapper Library 如何?错误:指纹不匹配
- C++ :: 安全地使用 reinterpret_cast 生成"wrapper"迭代器
- Java SWIG wrapper vs direct function calling
- C++ Wrapper for threadx RTOS?
- 传递对variadic-templates的引用使用std ::参考 - wrapper
- C++ Firebase wrapper?
- Sonarqube build wrapper for distutils
- Boost Python wrapper 和 OpenCv 参数错误与 cv::Mat.
- 如何使用"wrapper function"调用没有参数的递归函数 n 次?
- libev c++ wrapper function_thunk
- SOCI (SQL C++ wrapper) - PostgreSQL 不执行命令 (?)
- C++智能指针和指针到指针输出 API。模板化"wrapper"
- C++98 Wrapper for std::map::at()
- C# wrapper class for c++ lib dll
- Libragnar(Libtorrent Wrapper)LocalTorrent文件,而不是URL?C#/C++
- c++, Win32 LoadString wrapper
- SWIG生成的Lua<-->C++ Wrapper错误地处理了typedef重命名的基元类型
- 提交c++回调到.net c++ /CLI Wrapper
- 我正在得到掩护性 issuse 作为"Wrapper object use after free (WRAPPER_ESCAPE)"