【今日/总数】文章:0/2773 用户:0/10774 书籍:0/200
回顾2016,喜迎2017,以“回顾我与C++技术网的2016,展望C++技术网的2017”为主题,发表文章,将有机会赢得2个月的会员或现金红包。

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

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

为了封装函数指针,Boost.Function提供了一个名为boost::function的类。它定义于 boost/function.hpp,用法如下:

   #include <boost/function.hpp>    
   #include <iostream>    
   #include <cstdlib>    
   #include <cstring>    
   int main()  
   {  
     boost::function<int (const char*)> f = std::atoi;  
     std::cout << f("1609") << std::endl;  
     f = std::strlen;  
     std::cout << f("1609") << std::endl;  
   }  

   boost::function可以定义一个指针,指向具有特定签名的函数。以上例子定义了一个指针f,它可以指向某个接受一个类型为const char*的参数且返回一个类型为int的值的函数。定义完成后,匹配此签名的函数均可赋值给这个指针。这个例程就是先将std::atoi()赋值给f,然后再将它重赋值为std::strlen()。

   注意,给定的数据类型并不需要精确匹配,虽然std::strlen()是以std::size_t作为返回类型的,但是它也可以被赋值给f。

   因为f是一个函数指针,所以被赋值的函数可以通过重载的operator()()操作符来调用。取决于当前被赋值的是哪一个函数,在以上例子中将调用std::atoi()或std::strlen()。

   如果f未赋予一个函数而被调用,则会抛出一个boost::bad_function_call异常。

#include <boost/function.hpp>    
   #include <iostream>     
   int main()  
  {  
     try  
     {  
       boost::function<int (const char*)> f;  
       f("");  
     }  
     catch (boost::bad_function_call &ex)  
     {  
       std::cout << ex.what() << std::endl;  
     }  
   }  


   注意,将值 0 赋给一个 boost::function 类型的函数指针,将会释放当前所赋的函数。释放之后再调用它也会导致 boost::bad_function_call 异常被抛出。要检查一个函数指针是否被赋值某个函数,可以使用 empty() 函数或 operator bool() 操作符。

  通过使用 Boost.Function,类成员函数也可以被赋值给类型为 boost::function 的对象。


 #include <boost/function.hpp>    
   #include <iostream>    
   struct world  
   {  
     void hello(std::ostream &os)  
     {  
       os << "Hello, world!" << std::endl;  
     }  
   };  
   int main()  
   {  
     boost::function<void (world*, std::ostream&)> f = &world::hello;  
     world w;  
     f(&w, boost::ref(std::cout));  
   }  


   在调用这样的一个函数时,传入的第一个参数表示了该函数被调用的那个特定对象。因此,在模板定义中的左括号后的第一个参数必须是该特定类的指针。 接下来的参数才是表示相应的成员函数的签名。

   这个程序还使用了来自Boost.Ref库的boost::ref(),它提供了一个方便的机制向 Boost.Function传递引用。

文章来源:C++技术网 原创文章版权所有,未经授权,禁止转载。



返回顶部

关于我们 QQ群 广告服务 增值服务 捐款资助 版权声明 RSS订阅 站点地图 百度网站地图 意见反馈
鄂ICP备14001349号-2, Copyright © 2014-2017, CJJJS.COM/CJJJS.CN, All Rights Reserved

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