【发布时间】:2021-02-24 16:30:29
【问题描述】:
我需要将一百个回调函数的顺序传递给 C 库。我所有的回调都将非常相似,除了他们需要知道它注册了哪个“键”。 C API 不允许回传上下文。
换句话说,这就是 API:
void register_for_event(int event_type, void(*callback)());
我想出了这个模板元编程:
template<int event_type>
void event_handler() {
std::cout << "Event: " << event_type << std::endl;
}
template <int n = 100>
void register_event_handlers() {
register_for_event(n, event_handler<n>);
register_event_handlers<n-1>();
}
template<> void register_event_handlers<0>(){}
但是有没有办法这样写:
- 更容易阅读
- 编译速度更快(使用 gcc 编译文件需要几秒钟)
任何版本的 C++,直到 C++20,都适合我。
我正在尝试避免使用宏,但我不清楚宏在这里有什么帮助。
我可以使用 shell 脚本生成代码。如果我找不到更好的 C++ 原生方式,我可能最终会这样做。但我也对其他可能的原生 C++ 方式感兴趣。
【问题讨论】:
-
我在您的示例代码中看不到任何需要在编译时识别的内容。所以一个循环和一个接受整数参数的函数在这里可以工作。也许你的例子太简单了?
-
@Wyck 整数参数也是
event_handler的模板参数。 -
是的。但是事件处理程序在我的控制之下,所以如果有另一个解决方案可以调用一个公共函数
event_handler_for_all_events(int event_type),那就太好了。 -
如果你愿意接受对 libffi 的依赖,你可以使用它的蹦床功能来生成这 100 个回调。我前段时间为此写了一个答案。
标签: c++ templates template-meta-programming