zoukankan      html  css  js  c++  java
  • c++ 之bind使用

    网络编程中, 经常要使用到回调函数。 当底层的网络框架有数据过来时,往往通过回调函数来通知业务层。 这样可以使网络层只专注于 数据的收发, 而不必关心业务

    在c语言中, 回调函数的实现往往通过函数指针来实现。 但是在c++中 , 如果回调函数是一个类的成员函数。这时想把成员函数设置给一个回调函数指针往往是不行的

    因为类的成员函数,多了一个隐含的参数this。 所以直接赋值给函数指针肯定会引起编译报错

    c++11 为我们带来了bind, 可以很好的解决这个问题

    #include <functional>
    std::bind(待绑定的函数对象/函数指针/成员函数指针,参数绑定值1,参数绑定值2,...,参数绑定值n);

    #include <functional>
    #include <iostream>
    using namespace std::placeholders;
    using namespace std;
    
    class  test{
    public:  
          int i = 0;
          void incr(int j){ i+=j;}
    };
    
    void sample(){
         test *p =new test();
         
         auto f0=bind(&test::incr,p,_1);
         f0(2);     
         cout<<p->i<<endl;
             
    }
    

      要注意的是bind()函数 返回的是一个function 类型的对象, 并不能简单地赋值给c语言中定义的函数指针。

    例如上面的例子中,我们使用auto 直接推导了变量类型。如果要显示指定变量类型

    typedef void(*func)(int);

    func f1 =  bind(&test::incr,p,_1);

    这样是编译不过的, 必须写成function类型

    typedef function<void()> func;

    func f1 =  bind(&test::incr,p,_1);

  • 相关阅读:
    hdu 4144 状态压缩dp
    hdu 4118 树形dp
    hdu 4115 2-SAT判定
    hdu 4085 斯坦纳树
    hdu 3311 斯坦纳树
    hdu 4081 最小生成树+树形dp
    hdu 4424 并查集
    洛谷P2661信息传递
    洛谷P2746校园网
    树状数组模板
  • 原文地址:https://www.cnblogs.com/myd620/p/8706651.html
Copyright © 2011-2022 走看看