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);

相關文章
相關標籤/搜索