【问题标题】:How to pass lamda as a function pointer argument of member function?如何将 lambda 作为成员函数的函数指针参数传递?
【发布时间】:2019-07-13 15:52:08
【问题描述】:

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

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

预期结果:

8
2
15

我应该如何更正我的代码以获得预期的结果?

【问题讨论】:

  • 你的函数接受一个指向成员函数的指针。 addsub 是成员函数,lambda 不是。
  • 你不能。 C++ 不能以这种方式工作。
  • 那么如果没有实际的mult() 函数就不能将乘法函数传递给myFunc 吗?
  • 为什么myFuncmember 函数指针开头?您可以使用常规函数指针,并将 addsub 设为静态。
  • @ZackLee 我对我的回答进行了修改,您可能想尝试一下。

标签: c++ c++11 lambda


【解决方案1】:

一个选项是让你的函数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 live, template live


编辑

上面提供的示例仅适用于静态成员函数。要调用非静态成员函数,您可以使用pointer to member function type

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;

指向非静态成员函数live的指针

【讨论】:

  • 在这种情况下,您也可以使用常规函数指针。
  • 这不会编译。
  • @0x499602D2 成员函数必须是静态的,请查看实时链接
猜你喜欢
  • 2013-06-29
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2013-08-11
  • 2012-07-22
  • 2020-06-09
相关资源
最近更新 更多