如何编写看起来像方法的lambda表达式?

Dav*_*vid 2 c++ methods syntax lambda

我一直在努力解决这个问题.考虑以下代码(我假设已经定义了前向引用):

// Signature representing a pointer to a method call
typedef
   void (MyClass::*MyMethod)(int);

class MyClass
{
    MyClass();
    void method1(int i);
    void method2(int i);

    void associateMethod(int index, MyMethod m);
} 
Run Code Online (Sandbox Code Playgroud)

鉴于上述情况,构造函数可以执行以下操作:

MyClass::MyClass()
{
   associateMethod(1, &MyClass::method1);
   associateMethod(2, &MyClass::method2);
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够调用'associateMethod',其中第二个参数是匿名方法.但是,以下内容无法编译.

associateMethod(3, [this](int) -> void { /* some code here */ }
Run Code Online (Sandbox Code Playgroud)

我得到一个关于他们没有从lambda到MyMethod的可行转换的错误.

我想知道lambda语法是否需要在某处包含'MyClass',但随机猜测lambda表达式如

 MyClass::[this](int) -> void {}
Run Code Online (Sandbox Code Playgroud)

要么

 [this]&MyClass::(int) -> void {}
Run Code Online (Sandbox Code Playgroud)

不编译.

会欣赏任何指针(没有双关语意)

谢谢

use*_*042 5

你不能将lambda表达式转换为类成员函数指针,并且没有有效的语法使它看起来像1.

您应该声明MyMethodas std::function签名(如注释中所述),而不是原始函数指针:

using MyMethod = std::function<void(int)>;
Run Code Online (Sandbox Code Playgroud)

您可以使用lambdas然后初始化此参数:

MyClass::MyClass()
{
   associateMethod(1, [this](int a) { this->method1(a); });
   associateMethod(2, [this](int a) { this->method2(a); });
}
Run Code Online (Sandbox Code Playgroud)

1)Lambda函数可以被认为是编译器生成的可调用类,它将捕获作为构造参数,并为operator()()您指定的参数和主体提供重载.因此,没有可能有效转换为原始或成员函数指针.