C++如何通过循环等机制自动填充模板函数指针数组?
解决方案
核心思路是利用C++编译期整数序列特性,自动生成所有模板实例并填充数组,完全不需要手动枚举每个索引,运行效率和手写代码完全一致,没有额外性能损耗。
C++14 及更高版本方案
使用标准库的std::index_sequence实现,代码最简洁:
#include <array> #include <utility> constexpr size_t SlotCount = 8; // 替换为你的实际槽位数量 class CallbackObject { // callback state storage public: void callback(/* 你的回调参数列表 */) { /* 回调实现 */ }; } _slots[SlotCount]; template<size_t slot> static void callback(/* 你的回调参数列表 */) { _slots[slot].callback(/* 透传参数 */); } // 辅助生成数组的内部实现 template<size_t... Is> constexpr auto gen_callback_array_impl(std::index_sequence<Is...>) { return std::array{ callback<Is>... }; } // 对外调用接口,传入槽位数量即可 constexpr auto gen_callback_array() { return gen_callback_array_impl(std::make_index_sequence<SlotCount>{}); } // 直接生成完整数组,不需要手动枚举每个索引 constexpr auto _callbacks = gen_callback_array();
std::array和原生数组完全兼容,调用_callbacks.data()即可拿到原生数组指针,适配旧C API的参数要求。
多回调类型扩展方案
如果每个回调对象对应4种不同回调,可以封装通用生成模板,一次定义多处复用:
// 通用回调数组生成模板,第一个参数为回调模板类型 template<template<size_t> typename CallbackT, size_t N> constexpr auto gen_callback_array() { return []<size_t... Is>(std::index_sequence<Is...>){ return std::array{ CallbackT<Is>... }; }(std::make_index_sequence<N>{}); } // 定义4种不同的回调模板 template<size_t slot> void callback1(...) { _slots[slot].callback1(...); } template<size_t slot> void callback2(...) { _slots[slot].callback2(...); } template<size_t slot> void callback3(...) { _slots[slot].callback3(...); } template<size_t slot> void callback4(...) { _slots[slot].callback4(...); } // 一键生成4个回调数组 constexpr auto _callbacks1 = gen_callback_array<callback1, SlotCount>(); constexpr auto _callbacks2 = gen_callback_array<callback2, SlotCount>(); constexpr auto _callbacks3 = gen_callback_array<callback3, SlotCount>(); constexpr auto _callbacks4 = gen_callback_array<callback4, SlotCount>();
C++11 兼容方案
如果只能使用C++11,手动实现整数序列工具即可:
// 手动实现index_sequence兼容C++11 template<size_t... Is> struct index_sequence {}; template<size_t N, size_t... Is> struct make_index_sequence_impl : make_index_sequence_impl<N-1, N-1, Is...> {}; template<size_t... Is> struct make_index_sequence_impl<0, Is...> { using type = index_sequence<Is...>; }; template<size_t N> using make_index_sequence = typename make_index_sequence_impl<N>::type;
后续数组生成逻辑和C++14版本一致,仅需把带模板参数的lambda替换为普通模板函数即可。
内容的提问来源于stack exchange,提问作者norlesh
相关产品推荐
相关产品推荐

