【问题标题】:Map enum with values without using enum twice [duplicate]使用值映射枚举而不使用枚举两次[重复]
【发布时间】: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 想要做的 - 添加新时必须手动更新 map enum 值。链接答案的唯一好处是asserts 如果mapenum 值不匹配,这至少会产生一条错误消息,告诉用户更新map
  • 如果我正确理解问题在于更新必须保持同步的两件事,那么这可能是适合X-macros 的情况。
  • 感谢 Drew Dormann 和 Eugene。 X-Macros 似乎解决了这个问题。我会尽量让它适合我的情况。从来没有想过以这种方式使用宏:)
  • 一旦它变得足够大或风险足够大,我倾向于为这样的东西进行代码生成。我将有一个描述数据的文件和一个解析数据描述并生成代码来完成繁重工作的小程序。构建系统从那里管理一切。如果数据描述已更改,请重新生成代码。编译它,链接它。
  • 你真的需要枚举类型(即Type)吗?如果是这样,您是否需要命名值(即First)?对我来说,如果你需要 enum 值来获取正在变化的数据,这似乎是非常人为的......你需要命名值。

标签: c++ enums


【解决方案1】:

您可以在运行时而不是在编译时填充map,例如:

enum Type{ First, Second, Third, NumberOfTypes };

std::map<Type, std::pair<int, float>> mp;

...

// during program startup...
for(int i = First; i < NumberOfTypes; ++i) {
    mp.emplace(static_cast<Type>(i), std::make_pair(i, static_cast<float>(i)));
}

Online Demo

【讨论】:

  • 我认为您对 OP 示例的回复过于字面意思。用 1,2,3 填充地图只是为了说明。
  • 啊,对不起。这并不能真正解决我的问题。因为这些值并不总是与位置一致。这只是一个例子。
  • 如果您将值保存在单独的容器中,上述方法仍然可以正常工作。然后您将更新枚举,并向容器添加一个新值,for 循环将负责将这些值添加到您的 map 中 - 您只需将 enum 命名一次
  • @Tas 但每次我想向枚举添加新元素时,我仍然需要同步和更新两件事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
相关资源
最近更新 更多