我有一个用于管理相机配置的API。需要管理344个选项。当某个值更改时,API会调用回调函数来通知程序。注册函数采用一个函数指针作为回调函数。由于无法确定回调的来源,因此不能使用单个函数进行回调。
一种解决方法是创建344个单独的回调函数:
对于这个解决方案,我需要使用一个单独的工具/脚本来生成标题。
另一个解决方案是使用一些预处理器技巧(BoostPP),例如:
在我的经验中,这些宏对于开发人员来说难以阅读和维护。理想情况下,我可以使用像
一种解决方法是创建344个单独的回调函数:
void callback0(void*);
void callback1(void*);
...
void callback{n-1}(void*);
static void(*)(void*) callbacks[] = {callback0, callback1, ..., callback{n-1}};
对于这个解决方案,我需要使用一个单独的工具/脚本来生成标题。
另一个解决方案是使用一些预处理器技巧(BoostPP),例如:
BOOST_PP_FOR((0,1024), PRED, OP, MYSTERIOUS_CALLBACK_MACRO);
在我的经验中,这些宏对于开发人员来说难以阅读和维护。理想情况下,我可以使用像
RegisterCallback(popt, [n](void*){/*n-th callback*/});
这样的东西,但是lambda函数是一个函数对象而不是函数指针。我的问题是:我能动态创建这些函数吗?或者有比上述两种方法更好的解决方案吗?谢谢。编辑:我从Botje那里得到了答案。将对象传递给函数回调需要您在二进制级别上访问代码(超出C/C++范围)。如果您允许这样做,那么libffi可能是一个解决方案,因为它为每个函数实例生成一个特定的指针。它被广泛支持,但例如Visual Studio编译器不在列表中。编辑2:正如其他人指出的那样,这应该也适用于VS。
void*
参数的内容吗?Option
是否有一些字段可用于标识回调选项?它会传递到回调函数中吗?在那个void*
参数中传递了什么?static void(*)(void*) callbacks[]
是无效的语法,应该是static void(*callbacks[])(void*)
。 - KamilCukOption *
参数不是用来区分哪个选项被更新或其他吗?这可以是一个带有虚函数的 C++ 对象;单个回调函数可以进行分派。 - Kaz