【发布时间】:2021-12-05 22:37:30
【问题描述】:
我有一个类似这样的枚举类:
enum Type{ First, Second, Third};
我需要将它们映射到一些值,例如:
std::map<Type, std::pair<int, float>> mp{
{First, std::make_pair(1, 8.)},
{Second, std::make_pair(5, 2.)},
{Third, std::make_pair(3, 7.)}
};
这种方法的问题是,当我想向枚举添加新值时(比如说元素'Fourth'),我必须同时更新枚举类型和映射。如何解决这个问题?
【问题讨论】:
-
@GSerg 该链接中的建议答案正是这个问题的 OP 不想要做的 - 添加新时必须手动更新
mapenum值。链接答案的唯一好处是asserts 如果map与enum值不匹配,这至少会产生一条错误消息,告诉用户更新map。 -
如果我正确理解问题在于更新必须保持同步的两件事,那么这可能是适合X-macros 的情况。
-
感谢 Drew Dormann 和 Eugene。 X-Macros 似乎解决了这个问题。我会尽量让它适合我的情况。从来没有想过以这种方式使用宏:)
-
一旦它变得足够大或风险足够大,我倾向于为这样的东西进行代码生成。我将有一个描述数据的文件和一个解析数据描述并生成代码来完成繁重工作的小程序。构建系统从那里管理一切。如果数据描述已更改,请重新生成代码。编译它,链接它。
-
你真的需要枚举类型(即
Type)吗?如果是这样,您是否需要命名值(即First)?对我来说,如果你需要enum值来获取正在变化的数据,这似乎是非常人为的......你需要命名值。