现代C++如何实现枚举模板参数到类型模板参数的映射?
实现方案
这个需求完全可以实现,最低C11版本就支持,C17、C++20下可以写得更简洁。
核心思路
通过模板特化建立枚举值到类型的固定映射,再封装单参数的模板函数即可,不需要额外的运行时开销。
完整实现代码
基础版(兼容C++11及以上)
#include <string> enum class Enum { EVENT_ONE, EVENT_TWO }; // 1. 定义枚举到类型的映射模板 template<Enum e> struct EventTypeMap; // 2. 特化每个枚举对应的目标类型 template<> struct EventTypeMap<Enum::EVENT_ONE> { using type = int; }; template<> struct EventTypeMap<Enum::EVENT_TWO> { using type = std::string; }; // 原有双参数模板(如果不需要保留可以直接把逻辑合并到下方单参数版本) template<Enum e, typename T> void MyFunc() { // 原有函数逻辑 } // 3. 封装符合需求的单参数调用接口 template<Enum e> void MyFunc() { MyFunc<e, typename EventTypeMap<e>::type>(); } int main(int argc, const char* argv[]) { // 调用方式完全符合预期 MyFunc<Enum::EVENT_ONE>(); MyFunc<Enum::EVENT_TWO>(); return 0; }
C++14及以上优化版
可以新增别名模板简化类型获取逻辑:
// C++14起支持别名模板 template<Enum e> using EventTypeMap_t = typename EventTypeMap<e>::type; // 单参数接口可以简化为 template<Enum e> void MyFunc() { MyFunc<e, EventTypeMap_t<e>>(); }
C++20可选方案
如果映射规则比较复杂、需要对枚举值做合法性校验,可以结合concept做约束,简单固定映射场景下上述方案已经完全够用。
扩展说明
后续需要新增枚举和类型的映射关系时,只需要新增对应EventTypeMap的特化即可,不需要修改现有函数逻辑,符合开闭原则。
内容的提问来源于stack exchange,提问作者Zohar81
相关产品推荐
相关产品推荐

