我想在我的对象内编写一个实用程序函数指针,以调用该对象中的一组其他函数。该实用程序功能指针应使用默认功能初始化,但也可以覆盖。
这是我到目前为止所拥有的:
struct GameState {
void(*setup)() = [](){};
void(*handleInput)() = [](){};
void(*update)() = [](){};
void(*draw)() = [](){};
void(*run)() = [this]() { handleInput(); update(); draw(); };
}
编译器不喜欢在我的lambda函数捕获中使用this
,并且在该行中抛出以下所有错误:
E0413-不存在从“ lambda [] void()-> void”到“ void(*)()”的合适转换函数
C2440'正在初始化':无法从'GameState ::'转换为'void(__cdecl *)(void)'
C2439'GameState :: run':成员无法初始化
答案 0 :(得分:2)
问题在于类型不匹配。
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存储在堆中。