c++ - 模板生成一百个C回调函数,编译不慢

标签 c++ templates template-meta-programming

我需要将一百个回调函数的顺序传递给 C 库。我所有的回调都非常相似,只是他们需要知道它注册的是哪个“ key ”。 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++ 原生方式,我可能最终会这样做。但我也对其他可能的 native C++ 方式感兴趣。

    最佳答案

    这是一个 C++17 答案:

    template <std::size_t... I>
    void register_via_pack(std::index_sequence<I...>) {
        ( (register_for_event(I, event_handler<I>)),... );
    }
    
    register_via_pack(std::make_index_sequence<100>{});
    
    它使用 C++17 折叠表达式扩展模板参数包。不确定它在您的场景中是否编译得更快,但在 g++ -O3 下它的速度快了 4 倍。即使在 -Og 下,它也会生成展开的代码,而不是 100 级深度的递归。
    您可以使用 the trick here在 C++11/C++14 下做同样的事情。
    您可以通过使用立即调用的可变参数模板化 lambda 函数来摆脱额外的函数,但它不会更具可读性;)

    关于c++ - 模板生成一百个C回调函数,编译不慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64807808/

    相关文章:

    c++ - 将附加参数传递给 remove_if

    C++动态向下转换为具有模板模板参数的类模板是类模板或别名模板

    javascript - 如何处理 javascript 文件具有它使用的图像的 "relative"路径的情况?

    C++ 模板元编程- 不确定我是否大惊小怪?

    c++ - 创建类型特征以检测 C++ 中的仿函数

    c++ - 优雅地从指针初始化 std::array 到缓冲区?

    c++ - 在 CLion 控制台中重复用户输入

    django - 如何在 django 模板中使用 for 循环?

    c++ - 简化可变参数模板 : Remove some specializations

    c++ - 如何使用 3d 的 max 2016 SDK (C++) 在插件中添加保存文件对话框?