目標讀者:可以理解回調函數的含義函數
把類的成員函數做爲回調函數有三個步驟:this
#include <functional>
這一步是爲了方便地獲得所需的函數指針變量。spa
typedef std::function<void (int,int)> Fun;//注意void與()之間是空格而不是‘,’
typedef std::function<返回類型 (參數一,參數二)> 函數指針類型名稱
.net
要想直接將一個類成員函數設置爲一個回調函數,而不是使用靜態成員函數,須要用到std::bind。指針
Fun fun = bind(&Test::callback, this,placeholders::_1,placeholders::_2);
回調函數指針類型 函數指針變量 = bind(&類::回調函數, 類指針,參數佔位符);
code
》關於placeholders
placeholders域在這裏起到佔位符的做用,指明該參數是調用者在使用回調函數時傳入的第幾個參數。例如placeholders域下的
_1
、`_2分別表明調用者傳入的第一個、第二個參數。blog舉個例子:get
讀者能夠先看完下面回調函數的代碼實現後再回過來看這個例子,方便理解。回調函數
callback
是一個有兩個參數的回調函數。實現一個做差的功能。iovoid Test::callback(int a,int b) { printf("%d - %d = %d", a, b, a - b); }綁定時,設置把傳入的第2個參數傳給變量a,把傳入的第1個參數傳給變量b。
Fun fun = bind(&Test::callback,this,placeholders::_2,placeholders::_1);調用者在實際調用時,把值2傳給變量a,把值1傳給變量b。
fun(1,2);//fun(placeholder::_1, placeholder::_2);計算結果:
2 - 1 = 1
綁定時不只能夠傳入佔位符,還能夠直接傳入變量。例如
int x = 5; Fun fun = bind(&Test::callback,this,placeholders::_2,x);fun(1,2);輸出:
2 - 5 = -3
在這個代碼實例中,回調函數,綁定函數和調用函數都放在一個類裏面,在實際項目中綁定函數和回調函數通常處在一個類中,而調用函數則存在於其餘的類中。
#include <stdio.h> #include <functional> using namespace std; class Test { public: typedef std::function<void (int,int)> Fun;//typedef一個函數指針 void callback(int a,int b)/*回調函數*/ { printf("%d+%d = %d",a,b,a+b); } void bind()/*綁定*/ { Fun fun = bind(&Test::callback, this,placeholders::_1,placeholders::_2); call(1, fun); } void call(int a,Fun f)/*調用者*/ { f(a,2); } }; int main() { Test test; test.bind(); return 0; }
輸出結果:
1+2=3