c++ - 当函数必须访问其他成员时,如何将 lambda 函数分配给结构成员?

标签 c++ struct lambda function-pointers

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

这是我目前所拥有的:

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/

相关文章:

c++ - 在 Visual Studio 2010 中使用 OpenGL - 错误 LNK2019 : unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup

go - 尝试使用结构在 golang 中实现 OOPS

c++ - 我们可以使用 lambda 表达式作为函数参数的默认值吗?

c - 包含名为 "generic"的变量的结构无法在 C++/CLI 项目中编译

c++ - VC 2013 与 2015 中的 Lambda 删除器

c++ - 在 C++11 中存储对方法的引用时出错

c++ - 当同一个类中的另一个方法调用时版本方法的常量

c++ - C++ 中的静态变量

c++ - OOP 设计播放器和 AI 控制单元。动态 Actor ?

function - 如何将结构作为函数的参数传递