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)
不编译.
会欣赏任何指针(没有双关语意)
谢谢
你不能将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()()您指定的参数和主体提供重载.因此,没有可能有效转换为原始或成员函数指针.