我想在我的对象中编写一个实用程序函数指针,该指针调用对象中的一组其他函数。此实用程序函数指针应使用默认功能进行初始化,但也可以覆盖。
这是我到目前为止:
struct GameState {
void(*setup)() = [](){};
void(*handleInput)() = [](){};
void(*update)() = [](){};
void(*draw)() = [](){};
void(*run)() = [this]() { handleInput(); update(); draw(); };
}
编译器不喜欢使用this
in捕获我的lambda函数,并为该行吐出以下错误:
E0413 - 没有合适的转换函数从“lambda [] void() - > void”到“void(*)()”存在
C2440'初始化':无法从'GameState ::'转换为'void(__ cdecl *)(void)'
C2439'GameState :: run':成员无法初始化
问题是类型不匹配。
void(*run)() = [this]() { handleInput(); update(); draw(); }; }
您正在为函数指针分配lambda。 lambda不是函数指针,实际上是覆盖operator()
的类的实例。这个对象也在你的example
中捕获了这个。
该
void(*setup)() = [](){};
编译,因为没有捕获。当没有捕获时,没有状态,lambda可以被视为指针而不是类实例。
如果语言允许,你会喜欢这样的东西
// error
auto run = [this]() { handleInput(); update(); draw(); };·
但是在这种情况下不支持该语法。由于程序员不知道lambda对象的类型,因此无法编写其类型。
相反,会起作用的是:
std::function<void()>run = [this]() { handleInput(); update(); draw(); };
这不如使用lambda的类型定义run
那样有效,因为std::function
很可能将lambda存储在堆上。