我想在我的对象中编写一个实用函数指针,它调用对象中的一组其他函数。此实用程序函数指针应使用默认功能进行初始化,但也能够覆盖。
这是我目前所拥有的:
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/