zoukankan      html  css  js  c++  java
  • boost::bind的使用

      最近在几经波折之后,终于对于boost::bind有点理解了。对于习惯了其他语言的人来说,boost::bind是个挺神奇的东西,它可以将你的方法适配成任何其他的方法。其实这得益于c++的模板以及操作符重载,去看boost::bind的实现就会发现它是一个有n多重载的函数,这些重载主要是为了适应函数的参数个数。

      其实boost::bind的原理是函数对象,而函数对象就是一个重载了()操作符的对象,这样我们就可以像调用一个方法一样来调用一个类上的这个操作符,比如a(),其实你是在调用a这个对象的()方法,而不是调用一个叫a的方法。

      一般来说boost::bind有两种方式的调用,一种是对自由方法,也取非类方法, 一种是对类方法。

      对自由方法来说,直接boost::bind(函数名, 参数1,参数2,...)

      对类方法来说,直接boost::bind(&类名::方法名,类实例指针,参数1,参数2)

      这里需要额外注意的问题是,函数对象也可以像自由方法一样被bind,而boost::function也是一种函数对象。

      接下来我们需要注意什么情况下需要用_1, _2这样的参数。

     

    举个例子

    void test(int a, int b, int c)
    
    boost::bind(test, 1, _1, _2)得到一个函数对象b,当我们调用b(3,4)时,相当于调用test(1,3,4)
    
    boost::bind(test, _2, 3, _1)得到一个函数对象b,当我们调用b(3,4)时,相当于调用test(4,3,3)
    

       

    看明白了没有?你实际上可以指定一些常量和一些占位符进去,_x这样的就是占位符,_1表示实际调用时的参数位置,也即b(3,4)时_1代表3,_2代表4

    当然你也可以将所有的参数都指定

    比如boost::bind(test,1,2,3),那么在调用b()时就相当于调用test(1,2,3)

    需要注意的一点是,boost::bind里的参数个数一定要与被bind的函数相同,否则这个函数对象就无法生成了,编译器会抱怨一堆信息,如果你仔细看的话,它是在告诉你,没有这样的函数,你实际的函数是....,这是使用c++很杯具的一点,当遇到模板时,一旦报错,那些信息直接可以令人崩溃。

    在asio中,boost::bind被大量使用,原因是异步的情况下,每个函数的调用是独立的,它的所有信息应该包含在它的调用,也即函数对象中。因此asio中有大量的模板,如果在这种情况下你想要使用虚函数或者继承来写框架的话,会是一件很杯具的事情,在碰了很多次壁之后,我发现其实很多情况下我并不需要纯虚函数,我需要的只是一个函数指针,或者函数对象而已。

  • 相关阅读:
    Jmeter录制数据库脚本
    Jmeter代理方式录制并进行关联
    Jmeter基础知识
    总结Java各种API文档,提供下载.chm文件,HTML、java、w3school、servlet、js、spring、等等
    个人期末总结
    《软件工程导论》—领骑衫获奖感言
    201571030108/201571030112《小学四则运算练习软件软件需求说明》结对项目报告
    小学四则运算练习软件软件需求说明
    201571030108/201571030112《小学四则运算练习软件》结对项目报告
    小学生四则运算练习软件项目报告
  • 原文地址:https://www.cnblogs.com/wlzy/p/6613138.html
Copyright © 2011-2022 走看看