【发布时间】:2017-12-02 04:32:25
【问题描述】:
我一直在努力解决这个问题。考虑以下代码(我假设已经定义了前向引用):
// 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);
}
鉴于上述情况,构造函数可以执行以下操作:
MyClass::MyClass()
{
associateMethod(1, &MyClass::method1);
associateMethod(2, &MyClass::method2);
}
但是,我希望能够调用“associateMethod”,其中第二个参数是匿名方法。但是,以下内容无法编译。
associateMethod(3, [this](int) -> void { /* some code here */ }
我收到一条错误消息,称它们无法从 lambda 转换为 MyMethod。
我想知道 lambda 语法是否需要在某处包含“MyClass”,但随机猜测 lambda 表达式,例如
MyClass::[this](int) -> void {}
或
[this]&MyClass::(int) -> void {}
不要编译。
不胜感激任何指针(没有双关语)
谢谢
【问题讨论】:
-
为什么不在第一位使用
std::function而不是原始函数指针? -
无论您想在这里做什么,都不能以这种方式完成。类方法需要一个类的实例才能调用它们。这就是使它们成为类方法的原因。 lambda 不绑定到任何类的任何实例。 lambda 本身就是一个匿名类。 lambda 函数始终与唯一的匿名类的实例相关联。也许您想分享您正在尝试解决的真正问题。不,不是关于以这种方式使用 lambda 的问题,而是您认为解决方案是以这种方式使用 lambda 的任何问题。
-
很难给出一个具体的答案,因为你没有给出产生特定错误的工作代码。但是
using MyMethod = std::function<void(int)>可能是一个解决方案。 -
嗯,自从我上次使用 C++(多年前)以来,术语是否发生了变化?我的印象是实例成员函数需要一个对象实例,但类方法(使用静态定义)不需要类实例。但是,您的句子,“[a] lambda 不绑定到任何类的任何实例。lambda 本身就是一个匿名类。”实际上完全为我解决了问题。”
-
我实际上想要做的是注册一个类的选定方法,以便以后可以调用它们,但我希望我可以互换使用“就地”匿名代码(即 lambdas) .