You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何实现枚举与映射值绑定,新增枚举成员无需两处修改

解决方案

推荐使用**X Macro(宏列表)**方案实现枚举与映射的自动同步,新增枚举成员时仅需修改一处代码即可,无额外第三方依赖,全编译器版本兼容。

具体实现步骤

  1. 统一定义枚举项与对应映射值的宏列表,后续所有新增操作仅修改这一处
// 枚举项定义规则:X(枚举名, 对应int值, 对应float值)
#define TYPE_LIST \
    X(First, 1, 8.0) \
    X(Second, 5, 2.0) \
    X(Third, 3, 7.0)
  1. 自动生成枚举定义
enum Type {
#define X(name, int_val, float_val) name,
    TYPE_LIST
#undef X
};
  1. 自动生成映射表,无需手动逐个赋值
#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:06:04