• 3.3. Boost.Ref

    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()