背景
STL和Boost中的算法和函数大量使用了函数对象作为判断式或谓词参数,而这些参数都是传值语义,算法或函数在内部保留函数对象的拷贝并使用。
值传递不可行的情况:
- 作为参数的函数对象拷贝代价过高(具有复杂的内部状态)。
- 不希望拷贝对象(内部状态不应该改变)。
- 拷贝是禁止的(noncopyable、单件)。
ref
reference_wrapper
is primarily used to "feed" references to
function templates (algorithms) that take their parameter by
value. It provides an implicit conversion toT&
, which
usually allows the function templates to work on references
unmodified.
reference_wrapper
主要的作用就是传递引用给函数模板。类摘要如下:
template<class T> class reference_wrapper
{
public:
explicit reference_wrapper(T& t): t_(t) {}
operator T& () const { return *t_; }
T& get() const { return *t_; }
T* get_pointer() const { return t_; }
private:
T* t_;
};
boost::reference_wrapper<T>
提供了隐式转换(implicit conversion)成 T&.
boost::reference_wrapper<T>
同时支持拷贝构造和赋值(普通的引用不能赋值)
两个工厂函数
表达式boost::ref(x)
返回boost::reference_wrapper<X>(x)
表达式boost::cref(x)
返回boost::reference_wrapper<X const>(x)
template<class T> reference_wrapper<T> ref( T & t )
{
return reference_wrapper<T>(t);
}
template<class T> reference_wrapper<T const> cref( T const & t )
{
return reference_wrapper<T const>(t);
}