C++ - 将函数链接到触发器的有效和高效方法

C++ - Effective and efficient way of linking functions to triggers

本文关键字:有效 高效 方法 触发器 函数 链接 C++      更新时间:2023-10-16

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

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

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

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

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

请记住,buttonIndex和其他要offsetColour的参数应该是文字,因为 lambda 无法从封闭作用域捕获变量。