如何将lamda作为成员函数的函数指针参数传递?

时间:2019-07-13 15:52:08

标签: c++ c++11 lambda

我学习了如何将成员函数作为函数指针参数传递给另一个成员函数。

现在,我正在尝试将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   (测试:: *)(int,int)')

预期结果:

8
2
15

如何纠正我的代码,以便获得预期的结果?

1 个答案:

答案 0 :(得分:3)

一种选择是使函数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;
}

Live

感谢@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;
}

regular function pointer livetemplate live