c++ 之bind使用

网络编程中, 常常要使用到回调函数。 当底层的网络框架有数据过来时,每每经过回调函数来通知业务层。 这样能够使网络层只专一于 数据的收发, 而没必要关心业务ios

在c语言中, 回调函数的实现每每经过函数指针来实现。 可是在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);this

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

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

typedef function<void()> func;c++11

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

相关文章
相关标签/搜索