• 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中有大量的模板,如果在这种情况下你想要使用虚函数或者继承来写框架的话,会是一件很杯具的事情,在碰了很多次壁之后,我发现其实很多情况下我并不需要纯虚函数,我需要的只是一个函数指针,或者函数对象而已。

  • 相关阅读:
    Webpack 学习2
    Webpack 学习
    JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后
    JS魔法堂:再识Number type
    基础野:细说浮点数
    基础野:细说有符号整数
    基础野:细说无符号整数
    基础野:细说原码、反码和补码
    Vim魔法堂:认识快捷键绑定
    Httpd运维日志:通过apxs添加模块
  • 原文地址:https://www.cnblogs.com/wlzy/p/6613138.html
Copyright © 2020-2023  润新知