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

如何在C++中使用宏实现枚举与字符串双向映射的自动填充

实现方案:使用X宏(X-Macro)完成代码自动生成

这是C/C++场景下处理同类重复代码的经典方案,核心逻辑是把所有枚举项统一维护在一个列表宏中,通过重定义宏的展开规则,自动生成枚举定义、两个映射表的填充逻辑,全程仅需修改一处即可同步所有关联代码。

具体实现步骤

1. 定义统一的枚举项列表宏

把所有枚举值都放在这个宏里,后续新增枚举仅需修改这个列表:

// 所有枚举项统一维护在此处,新增项只需加一行X(枚举名)
#define COLOR_ID_LIST \
    X(UNKNOWN) \
    X(GREEN) \
    X(RED) \
    X(BLUE) \
    X(YELLOW)

2. 生成枚举定义

通过重定义X宏的展开规则,自动生成枚举结构体:

enum COLOR_ID {
#define X(name) name,
    COLOR_ID_LIST // 展开后就是所有枚举项的定义
#undef X // 用完立即取消宏定义,避免污染其他代码
};

3. 自动填充双映射表

同样通过重定义X宏,一次遍历生成两个映射表的所有键值对:

#include <unordered_map>
#include <string>

std::unordered_map<std::string, COLOR_ID> str_id_map;
std::unordered_map<COLOR_ID, std::string> id_str_map;

// 映射表初始化函数,程序启动时调用一次即可
void init_color_maps() {
#define X(name) \
    str_id_map[#name] = name; \
    id_str_map[name] = #name;
    COLOR_ID_LIST // 展开后就是所有映射项的赋值代码
#undef X
}

其中#name是宏的字符串化操作,会把传入的枚举名直接转成对应的字符串常量,无需手动写字符串。

扩展说明

  • 如果需要自定义枚举值的数值,可把列表宏的参数调整为两个:X(枚举名, 数值),对应修改枚举定义的展开规则为#define X(name, val) name = val,即可,映射表的填充逻辑无需修改。
  • 若不想手动调用初始化函数,可将两个映射表封装为单例类,在类的构造函数中执行初始化逻辑,保证首次使用前自动完成填充。
  • C++17及以上版本可配合constexpr数组实现编译期的枚举-字符串映射,无需运行时初始化哈希表,性能更高,核心的X宏维护逻辑不变。

内容的提问来源于stack exchange,提问作者xycs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:57:04