gpt4 book ai didi

c++ - 当函数必须访问其他成员时,如何将 lambda 函数分配给结构成员?

转载 作者:行者123 更新时间:2023-11-27 23:40:24 27 4
gpt4 key购买 nike

我想在我的对象中编写一个实用函数指针,它调用对象中的一组其他函数。此实用程序函数指针应使用默认功能进行初始化,但也能够覆盖。

这是我目前所拥有的:

struct GameState {
void(*setup)() = [](){};
void(*handleInput)() = [](){};
void(*update)() = [](){};
void(*draw)() = [](){};
void(*run)() = [this]() { handleInput(); update(); draw(); };
}

编译器不喜欢在捕获我的 lambda 函数时使用this,并为该行吐出以下所有错误:

E0413 - no suitable conversion function from "lambda []void ()->void" to "void (*)()" exists

C2440 'initializing': cannot convert from 'GameState::' to 'void (__cdecl *)(void)'

C2439 'GameState::run': member could not be initialized

最佳答案

问题是类型不匹配。

void(*run)() = [this]() { handleInput(); update(); draw(); }; }

您正在将 lambda 赋值给函数指针。 lambda 不是函数指针,实际上是重写 operator() 的类的实例。此对象还在您的 示例 中捕获此内容。

void(*setup)() = [](){};

编译因为没有捕获。当没有捕获时,就没有状态,lambda 可以被视为指针而不是类实例。

如果语言允许,你会喜欢这样的东西

// error
auto run = [this]() { handleInput(); update(); draw(); };·

但是在这种情况下不支持该语法。由于程序员不知道 lambda 对象的类型,因此无法编写其类型。

相反,将起作用的是:

std::function<void()>run  = [this]() { handleInput(); update(); draw(); };

这不如使用 lambda 类型定义 run 有效,因为 std::function 很可能会将 lambda 存储在堆上。

关于c++ - 当函数必须访问其他成员时,如何将 lambda 函数分配给结构成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55555087/

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