【问题标题】:C++ - Effective and efficient way of linking functions to triggersC++ - 将函数链接到触发器的有效方法
【发布时间】:2023-03-21 22:55:02
【问题描述】:

我的程序中的 UI 系统目前通过将 void(*)() 类型的函数指针分配给 触发元素(屏幕上的四边形,键盘上的键)以及可指定的调用条件来工作 每帧都会与按键(使用 GLFW)、鼠标按钮或光标的实际情况进行比较,以确定是否应该调用回调函数。 键的条件可以是KeyCondition(PRESS, LEFT_SHIFT),如果在按住左移键的同时按下键,它将调用绑定到键的回调。

我的问题是我只能分配void(*)() 类型的这些按钮功能,这使我无法将参数传递给按钮回调。 例如,如果我想让一个按钮在光标悬停在它上面时亮起,我必须创建一个指定函数void highlightButtonA(),它在内部将按钮A 的颜色设置为更高的值,而我当然会做很多而是能够将回调设置为void offsetColor(unsigned int buttonIndex, float r, float g, float b, float a) 之类的东西,并将单独的参数传递给每个回调。

有没有办法做到这一点?是否有一些函数指针可以指向任何形状的函数并以某种方式存储参数?我应该在多大程度上担心这些解决方案的性能?我的程序必须能够每秒处理多个按键/按钮按下并且仍然保持稳定,因为它是一款快节奏的射击游戏。

【问题讨论】:

  • 你考虑过使用 Qt 吗?他们有一个signals and slots 系统,非常适合将函数绑定到触发器。
  • 这听起来像是您正在寻找带有包含变量的闭包的 c++11 和 c++14 lambda。
  • @CoryKramer Qt 插槽与函数指针不一样吗?它说它们是成员函数,但为了存储信号和插槽之间的连接,我想你必须存储一个指向函数的指针。

标签: c++ function user-interface function-pointers


【解决方案1】:

您可以使用衰减为函数指针的非捕获 lambda,如下所示:

button.OnMouseHover([]{ offsetColour(buttonIndex, r, g, b, a); });

请记住 buttonIndexoffsetColour 的其他参数应该是文字,因为 lambda 无法从封闭范围捕获变量。

【讨论】:

  • lambda 不能捕获任何变量有什么原因吗?
  • 因为捕获 lambda 不能衰减到函数指针,因为它现在是一个有状态的对象(用于存储捕获的变量)
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多