3.3. Boost.Ref

本库 Boost.Ref 通常与 Boost.Bind 一起使用,所以我把它们挨着写。 它提供了两个函数 - boost::ref()boost::cref() - 定义于 boost/ref.hpp.

当要用于 boost::bind() 的函数带有至少一个引用参数时,Boost.Ref 就很重要了。 由于 boost::bind() 会复制它的参数,所以引用必须特别处理。

  1. #include <boost/bind.hpp>
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. void add(int i, int j, std::ostream &os)
  7. {
  8. os << i + j << std::endl;
  9. }
  10.  
  11. int main()
  12. {
  13. std::vector<int> v;
  14. v.push_back(1);
  15. v.push_back(3);
  16. v.push_back(2);
  17.  
  18. std::for_each(v.begin(), v.end(), boost::bind(add, 10, _1, boost::ref(std::cout)));
  19. }

以上例子使用了上一节中的 add() 函数。 不过这一次该函数需要一个流对象的引用来打印信息。 因为传给 boost::bind() 的参数是以值方式传递的,所以 std::cout 不能直接使用,否则该函数会试图创建它的一份拷贝。

通过使用模板函数 boost::ref(),象 std::cout 这样的流就可以被以引用方式传递,也就可以成功编译上面这个例子了。

要以引用方式传递常量对象,可以使用模板函数 boost::cref()