C++如何实现枚举与映射值绑定,新增枚举成员无需两处修改
解决方案
推荐使用**X Macro(宏列表)**方案实现枚举与映射的自动同步,新增枚举成员时仅需修改一处代码即可,无额外第三方依赖,全编译器版本兼容。
具体实现步骤
- 统一定义枚举项与对应映射值的宏列表,后续所有新增操作仅修改这一处
// 枚举项定义规则:X(枚举名, 对应int值, 对应float值) #define TYPE_LIST \ X(First, 1, 8.0) \ X(Second, 5, 2.0) \ X(Third, 3, 7.0)
- 自动生成枚举定义
enum Type { #define X(name, int_val, float_val) name, TYPE_LIST #undef X };
- 自动生成映射表,无需手动逐个赋值
#include <map> #include <utility> const std::map<Type, std::pair<int, float>> mp = [](){ std::map<Type, std::pair<int, float>> tmp; #define X(name, int_val, float_val) tmp.emplace(name, std::make_pair(int_val, float_val)); TYPE_LIST #undef X return tmp; }();
后续新增枚举的操作
仅需要在TYPE_LIST中新增一行即可,比如新增Fourth成员:
#define TYPE_LIST \ X(First, 1, 8.0) \ X(Second, 5, 2.0) \ X(Third, 3, 7.0) \ X(Fourth, 自定义int值, 自定义float值) // 仅需加这一行
枚举定义和映射表会在编译时自动生成,无需修改其他代码。
优化可选方案
如果你的枚举是从0开始的连续值,可以用数组代替map获得更高的访问性能:
constexpr std::pair<int, float> type_mapping[] = { #define X(name, int_val, float_val) {int_val, float_val}, TYPE_LIST #undef X }; // 取值直接用数组索引即可,无需查找 auto val = type_mapping[First];
内容的提问来源于stack exchange,提问作者Abdurasul Rakhimov
相关产品推荐
相关产品推荐

