当前位置:开发工具->Boost->Boost简单学习——函数对象Boost.Ref

原创版权标志Boost简单学习——函数对象Boost.Ref

作者:烫烫烫烫烫烫烫烫  发表时间:2015-11-21  阅读:
[摘要] 这次主要介绍的是函数对象,可能称为“高阶函数”更为适合。它实际上是指那些可以被传入到其它函数或是从其它函数返回的一类函数,在C++中高阶函数是被实现为函数对象的。本文将会介绍几个用于处理函数对象的Boost C++库。 其中,Boost.Bind可替换来自C++标准的著名的 std::bind1st() 和 std::bind2nd() 函数,而 Boost.Function则提供了一个用于封装函数指针的类。 最后,Boost.Lambda则引入了一种创建匿名函数的方法。
文章来源:C++技术网原创文章版权所有,会员文章禁止转载。非会员文章转载做好本文超链接即表示授权转载。通过文章下面的分享按钮可以自由分享所有文章。

    本库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()。

文章来源:C++技术网原创文章版权所有,会员文章禁止转载。非会员文章转载做好本文超链接即表示授权转载。通过文章下面的分享按钮可以自由分享所有文章。


返回顶部

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)

C++技术网群幕群聊

弹幕