当函数必须访问其他成员时,如何为该成员分配lambda函数?

时间:2019-04-07 02:23:47

标签: c++ class struct lambda function-pointers

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

这是我到目前为止所拥有的:

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':成员无法初始化

1 个答案:

答案 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存储在堆中。