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

问题描述 投票:0回答:1

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

这是我到目前为止:

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

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

E0413 - 没有合适的转换函数从“lambda [] void() - > void”到“void(*)()”存在

C2440'初始化':无法从'GameState ::'转换为'void(__ cdecl *)(void)'

C2439'GameState :: run':成员无法初始化

c++ class struct lambda function-pointers
1个回答
3
投票

问题是类型不匹配。

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存储在堆上。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.