reference_wrapper
简介
- reference_wrapper包含在ref库中,它是引用包装器类型,即其内部包装了引用。
- 成员函数get()、get_pointer()分别可以获得被包装的引用和其指针。使用需要包含头文件"boost/ref.hpp"。
eg
#include "boost/ref.hpp"
#include <cassert>
int main()
{
int x = 5;
boost::reference_wrapper<int> rw(x);
rw.get() = 10; //获得引用
*rw.get_pointer() = 15; //获得指针
int n = rw; //隐式转换为int
assert(x == rw); //隐式转换为int
rw = 20; //错误!引用包装器不能作为左值
(int&)rw = 20; //显示转换为int&,这样可以作为左值
assert(x == 20);
boost::reference_wrapper<int> rw2(rw); //拷贝构造
rw.get() = 25;
assert(rw2.get() == 25);//rw2也是x的一个引用对象
//在确实需要持有或者修改字符串的时候可以调用成员函数 to_string() 获得一个拷贝来保证安全
return 0;
}
ref
使用函数ref()和cref()可以很方便的构造reference_wrapper和const reference_wrapper对象,它们可以根据参数的类型推导出引用的类型。
unwrap_ref()
概念
- unwrap_ref()也可以获得引用包装器内包装的引用,而且其参数也可以不是引用包装器类型,这时候它直接返回参数的引用。
使用
#include "boost/ref.hpp"
#include <cassert>
int main()
{
int x = 5;
auto rw = boost::ref(x); //使用ref()定义了一个reference_wrapper对象
rw.get() = 10;//获得引用
boost::unwrap_ref(rw) = 15; //获得引用
assert(rw == 15); //隐式转换
return 0;
}