Ref 库是一个小型库,它对于将引用传递给通常会复制其参数的函数模板(算法)非常有用。它定义了类模板 boost::reference_wrapper<T>
、两个函数 boost::ref
和 boost::cref
(它们返回 boost::reference_wrapper<T>
的实例)、一个函数 boost::unwrap_ref
(它解包 boost::reference_wrapper<T>
,或者返回对任何其他类型对象的引用),以及两个 traits 类 boost::is_reference_wrapper<T>
和 boost::unwrap_reference<T>
。
boost::reference_wrapper<T>
的目的是包含对 T
类型对象的引用。它主要用于“喂入”引用到按值获取参数的函数模板(算法)。
为了支持这种用法,boost::reference_wrapper<T>
提供了到 T&
的隐式转换。这通常允许函数模板在未修改的引用上工作。
boost::reference_wrapper<T>
既是可复制构造的又是可赋值的(普通引用不可赋值)。
表达式 expression boost::ref(x)
返回 boost::reference_wrapper<X>(x)
,其中 X
是 x
的类型。 类似地,boost::cref(x)
返回 boost::reference_wrapper<X const>(x)
。
表达式 boost::unwrap_ref(x)
返回 boost::unwrap_reference<X>::type&
,其中 X
是 x
的类型。
表达式 boost::is_reference_wrapper<T>::value
在 T
是 reference_wrapper
时为 true
,否则为 false
。
类型表达式 boost::unwrap_reference<T>::type
在 T
是 reference_wrapper
时为 T::type
,否则为 T
。
namespace boost { template<typename T> struct is_reference_wrapper; template<typename T> class reference_wrapper; template<typename T> struct unwrap_reference; template<typename T> reference_wrapper< T > const ref(T &); template<typename T> reference_wrapper< T const > const cref(T const &); template<typename T> void ref(T const &&); template<typename T> void cref(T const &&); template<typename T> unwrap_reference< T >::type & unwrap_ref(T &); }
ref
和 cref
最初是 Jaakko Järvi 的 Tuple 库的一部分。 Peter Dimov 因为它们通常很有用,所以将它们“提升为 boost::
状态”。 Douglas Gregor 和 Dave Abrahams 贡献了 is_reference_wrapper
和 unwrap_reference
。 Frank Mori Hess 和 Ronald Garcia 贡献了 boost::unwrap_ref
。