如何迭代枚举?

新手上路,请多包涵

我刚刚注意到您不能在 enum 例如 +++= 上使用标准数学运算符。

那么遍历 C++ 中所有值的最佳方法是什么 enum

原文由 Adam 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

典型的方式如下:

 enum Foo {
  One,
  Two,
  Three,
  Last
};

for ( int fooInt = One; fooInt != Last; fooInt++ )
{
   Foo foo = static_cast<Foo>(fooInt);
   // ...
}

请注意,枚举 Last 意味着被迭代跳过。利用这个“假” Last 枚举,您不必在每次想要添加新枚举时将 for 循环中的终止条件更新为最后一个“真实”枚举。如果您想稍后添加更多枚举,只需在 Last 之前添加它们。此示例中的循环仍然有效。

当然,如果指定了枚举值,这将失效:

 enum Foo {
  One = 1,
  Two = 9,
  Three = 4,
  Last
};

这说明枚举并不是真的要迭代。处理枚举的典型方法是在 switch 语句中使用它。

 switch ( foo )
{
    case One:
        // ..
        break;
    case Two:  // intentional fall-through
    case Three:
        // ..
        break;
    case Four:
        // ..
        break;
     default:
        assert( ! "Invalid Foo enum value" );
        break;
}

如果您真的想枚举,请将枚举值填充到向量中并对其进行迭代。这也将正确处理指定的枚举值。

原文由 andreas buykx 发布,翻译遵循 CC BY-SA 4.0 许可协议

(以马尔斯基的回答作为一个很大的暗示……)

由于枚举定义的主体与初始化列表相同,因此如果我们使用简单的宏来写出值,则可以在不重复项列表的情况下执行此操作:

 #define ITEM_LIST_MACRO Wolf, Goat, Cabbage

enum Item { ITEM_LIST_MACRO }; // Define the enum

// Now iterate through it
for (auto item : { ITEM_LIST_MACRO }) {
}

优点:简单,没有重复,不需要维护烦人的第一个/最后一个哨兵值。 (实际上,我认为这可能是迄今为止建议的唯一解决方案,它不需要用户记住在将新项目添加到列表时更新“结束”标记。)

缺点:不适用于范围枚举(枚举类),因为初始化列表需要范围(Item::Wolf 等)。如果您想指定枚举成员的值而不是让它们默认,也不起作用。

原文由 void 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题