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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM