3.3. Boost.Ref
本库 Boost.Ref 通常与 Boost.Bind 一起使用,所以我把它们挨着写。 它提供了两个函数 - boost::ref()
和 boost::cref()
- 定义于 boost/ref.hpp
.
当要用于 boost::bind()
的函数带有至少一个引用参数时,Boost.Ref 就很重要了。 由于 boost::bind()
会复制它的参数,所以引用必须特别处理。
- #include <boost/bind.hpp>
- #include <iostream>
- #include <vector>
- #include <algorithm>
- void add(int i, int j, std::ostream &os)
- {
- os << i + j << std::endl;
- }
- int main()
- {
- std::vector<int> v;
- v.push_back(1);
- v.push_back(3);
- v.push_back(2);
- std::for_each(v.begin(), v.end(), boost::bind(add, 10, _1, boost::ref(std::cout)));
- }
以上例子使用了上一节中的 add()
函数。 不过这一次该函数需要一个流对象的引用来打印信息。 因为传给 boost::bind()
的参数是以值方式传递的,所以 std::cout 不能直接使用,否则该函数会试图创建它的一份拷贝。
通过使用模板函数 boost::ref()
,象 std::cout 这样的流就可以被以引用方式传递,也就可以成功编译上面这个例子了。
要以引用方式传递常量对象,可以使用模板函数 boost::cref()
。