当前位置: 首页 > 知识库问答 >
问题:

如何分配一个lambda函数的结构成员,当函数必须访问其他成员?

乌璞瑜
2023-03-14

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

这就是我到目前为止所做的:

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

编译器不喜欢在捕获lambda函数时使用this,并针对该行抛出以下错误:

E0413-没有来自“lambda[]void()的合适转换函数-

C2440“正在初始化”:无法从“游戏状态::”转换为“void(uu cdecl*)(void)”

C2439'GameState::运行':无法初始化成员

共有1个答案

邵城
2023-03-14

问题是类型不匹配。

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

您正在将lambda分配给函数指针。lambda不是函数指针,实际上是重写操作符()的类的实例。此对象还将在您的示例中捕获此信息。

这个

void(*setup)(=[](){}

编译,因为没有捕获。当没有捕获时,就没有状态,lambda可以被视为指针,而不是类实例。

如果语言允许的话,你会喜欢

// error
auto run  = [this]() { handleInput(); update(); draw(); };·

但这种语法在这种上下文中不受支持。由于程序员不知道lambda对象的类型,因此无法编写其类型。

相反,将起作用的是:

std::function<void()>run  = [this]() { handleInput(); update(); draw(); };

这不如用lambda的类型定义run,因为std::function很可能将lambda存储在堆上。

 类似资料:
  • 问题内容: 我只是编写了一个示例程序来查看 删除此文件* 的行为 * 问题 在fun()中执行 删除操作 后,如何在fun()中使用此指针访问func_2()? 现在主要在删除该指针时如何执行 obj- > fun_2? 如果在杀死该对象后能够访问函数成员,那么为什么数据成员的数据为零‘0’? m使用linux ubuntu和g ++编译器 问题答案: 让我们将其与类似的szenario进行比较:

  • 在这两个示例中,通过偏移其他成员的指针来访问结构成员是否会导致未定义/未指定/实现定义的行为? C11§6.7.2.1第14段似乎表明,这应该是实施定义: 结构或联合对象的每个非位字段成员都以适合其类型的实现定义方式对齐。 后来又说: 结构对象中可能有未命名的填充,但在其开头没有。 但是,如下所示的代码似乎相当常见: 该标准似乎保证 与 和< code >( 原始应用程序正在考虑从一个结构字段到另

  • 我被C++14的编译器错误弄糊涂了。它涉及成员变量的缺省构造函数的必要性。在下面的代码中,类A没有默认构造函数。类B有一个由它移动分配的类型a的成员。编译器抱怨缺少的默认构造函数,即使我没有显式地调用它。在B的构造函数中是否有一些对A的默认构造函数的隐式调用,而我缺少了这些调用?我的理解是,如果您在B的构造函数中初始化B的成员,那么默认构造函数就不是必需的。 当B被注释掉时,main中的代码工作得

  • 条款19: 分清成员函数,非成员函数和友元函数 成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。所以,如果有个函数必须进行动态绑定(见条款38),就要采用虚拟函数,而虚拟函数必定是某个类的成员函数。关于这一点就这么简单。如果函数不必是虚拟的,情况就稍微复杂一点。 看下面表示有理数的一个类: class rational { public: rational(int nume

  • 访问结构成员或类成员时,使用成员访问运算符(member access operator),包括圆点运算符(.)和箭头运算符(—>)。圆点运算符通过对象的变量名或对象的引用访问结构和类成员。例如,要打印 timeObject 结构的 hour 成员,用下列语句: cout << timeobject.hour; 要打印timeRef引用的结构的hour成员,用下列语句: cout << timeR

  • 注意:如果friend函数只是在类中声明并在外部实现,那么Clang和GCC都会拒绝该代码。