Ref 函式庫是一個小型函式庫,可用於將參照傳遞給通常會複製引數的函式模板(演算法)。它定義了類別模板 boost::reference_wrapper<T>
、兩個函式 boost::ref
和 boost::cref
,它們會傳回 boost::reference_wrapper<T>
的實例、一個函式 boost::unwrap_ref
,它會展開 boost::reference_wrapper<T>
或傳回任何其他類型物件的參照,以及兩個特性類別 boost::is_reference_wrapper<T>
和 boost::unwrap_reference<T>
。
boost::reference_wrapper<T>
的目的是包含對類型 T
物件的參照。它主要用於將參照「饋送」給以傳值方式接受參數的函式模板(演算法)。
為了支援這種用法,boost::reference_wrapper<T>
提供了到 T&
的隱式轉換。這通常允許函式模板在未修改的參照上運作。
boost::reference_wrapper<T>
既可複製建構也可賦值(一般參照不可賦值)。
運算式 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
的類型。
如果 T
是一個 reference_wrapper
,表達式 boost::is_reference_wrapper<T>::value
的值為 true
,否則為 false
。
如果 T
是一個 reference_wrapper
,類型表達式 boost::unwrap_reference<T>::type
為 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
。