簡體   English   中英

如何將lamda作為成員函數的函數指針參數傳遞?

[英]How to pass lamda as a function pointer argument of member function?

我學習了如何將成員函數作為函數指針參數傳遞給另一個成員函數。

現在,我試圖將lamda作為成員函數的函數指針參數傳遞。

我的代碼:

#include <iostream>

using namespace std;

class Test
{
public:
    int add(int a, int b)
    {
        return a + b;
    }
    int sub(int a, int b)
    {
        return a - b;
    }
    typedef int (Test::*funcPtr)(int a, int b);
    int myFunc(funcPtr func, int a, int b)
    {
        return (this->*func)(a, b);
    }
    void setup()
    {
        cout << myFunc(&Test::add, 5, 3) << endl;
        cout << myFunc(&Test::sub, 5, 3) << endl;
        cout << myFunc([](int a, int b) {return a * b;}, 5, 3) << endl; //ERROR!!!
    }
};

int main()
{
    Test test;
    test.setup();
}

結果:

錯誤::沒有從lambda到'Test :: funcPtr'的可行轉換(又名'int(Test :: *)(int,int)')

預期結果:

8
2
15

我應該如何糾正我的代碼,以便獲得預期的結果?

一種選擇是使函數static ,然后將std::function用作類型:

using funcType = std::function<int(int, int)>;
int myFunc(funcType func, int a, int b)
{
    return func(a, b);
}

void setup()
{
    cout << myFunc(Test::add, 5, 3) << endl;
    cout << myFunc(Test::sub, 5, 3) << endl;
    cout << myFunc([](int a, int b) {return a * b;}, 5, 3) << endl;
}

生活

感謝@holyBlackCat ,另一個選擇是使用常規函數指針(成員函數必須是static ):

typedef int (*funcPtr)(int a, int b);
//or:
//using funcPtr =  int (*)(int a, int b);
int myFunc(funcPtr func, int a, int b)
{
    return (*func)(a, b);
}

以及模板:

template<typename funcType>
int myFunc(funcType func, int a, int b)
{
    return func(a, b);
}
void setup()
{
    cout << myFunc(Test::add, 5, 3) << endl;
    cout << myFunc(Test::sub, 5, 3) << endl;
    cout << myFunc([](int a, int b) {return a * b;}, 5, 3) << endl;
}

常規函數指針live模板live


編輯

上面提供的示例僅適用於靜態成員函數。 要調用非靜態成員函數,可以使用指向成員函數類型的指針

using funcPtr = int(Test::*)(int a, int b);
int myFunc(funcPtr func, int a, int b)
{
    return invoke(func, this, a, b);
}

//..
// call:
cout << myFunc(&Test::add, 5, 3) << endl;

指向非靜態成員函數現場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM