網絡編程中, 常常要使用到回調函數。 當底層的網絡框架有數據過來時,每每經過回調函數來通知業務層。 這樣能夠使網絡層只專一於 數據的收發, 而沒必要關心業務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);