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