gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:42 25 4
gpt4 key购买 nike

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

// 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 {}

不要编译。

不胜感激(没有双关语)

谢谢

最佳答案

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

您应该将 MyMethod 声明为 std::function 签名(如评论中所述),而不是原始函数指针:

using MyMethod = std::function<void(int)>;

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

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

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

关于c++ - 如何编写看起来像方法的 lambda 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47604606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com