使用類的成員函數來實現回調函數

目標讀者:可以理解回調函數的含義函數


把類的成員函數做爲回調函數有三個步驟:this

  1. 實現這個成員函數,
  2. 對這個函數進行綁定
  3. 將綁定好的函數指針傳給調用函數。

1、添加頭文件

#include <functional>

2、typedef一個函數指針類型

這一步是爲了方便地獲得所需的函數指針變量spa

typedef std::function<void (int,int)> Fun;//注意void與()之間是空格而不是‘,’

typedef std::function<返回類型 (參數一,參數二)> 函數指針類型名稱.net

3、函數綁定

要想直接將一個類成員函數設置爲一個回調函數,而不是使用靜態成員函數,須要用到std::bind。指針

Fun fun = bind(&Test::callback, this,placeholders::_1,placeholders::_2);

回調函數指針類型 函數指針變量 = bind(&類::回調函數, 類指針,參數佔位符);code


》關於placeholders

placeholders域在這裏起到佔位符的做用,指明該參數是調用者在使用回調函數時傳入的第幾個參數。例如placeholders域下的_1、`_2分別表明調用者傳入的第一個、第二個參數。blog

舉個例子get

讀者能夠先看完下面回調函數的代碼實現後再回過來看這個例子,方便理解。回調函數

callback是一個有兩個參數的回調函數。實現一個做差的功能。io

void 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

4、代碼實例

在這個代碼實例中,回調函數,綁定函數和調用函數都放在一個類裏面,在實際項目中綁定函數和回調函數通常處在一個類中,而調用函數則存在於其餘的類中。

#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

5、參考資料:

一、std::function與std::bind 函數指針 (實現回調函數的不一樣方式)

二、cplusplus:std::placeholders (placeholders的用法)

相關文章
相關標籤/搜索