在C++的算法和函数之间,以类对象作为参数的情况很非常常见的问题,一般情况下传值语义是可行的,但也有很多特殊情况,作为参数的函数对象拷贝代价过高(具有复杂的内部状态),或者不希望拷贝对象(内部状态不应该被改变),甚至拷贝是不可行的(noncopyable、单件)。
template
<
class
T>
class
reference_wrapper
{
public
:
typedef
T type;
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1300 )
explicit
reference_wrapper(T& t): t_(&t) {}
#else
explicit
reference_wrapper(T& t): t_(boost::addressof(t)) {}
//
#endif
operator T& ()
const
{
return
*t_; }
T& get()
const
{
return
*t_; }
T* get_pointer()
const
{
return
t_; }
private
:
T* t_;
};
通过转换构造函数将T的对象转化为T的引用,能够减少函数的传参过程中的开销