我刚刚注意到您不能在 enum
例如 ++
或 +=
上使用标准数学运算符。
那么遍历 C++ 中所有值的最佳方法是什么 enum
?
原文由 Adam 发布,翻译遵循 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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
典型的方式如下:
请注意,枚举
Last
意味着被迭代跳过。利用这个“假”Last
枚举,您不必在每次想要添加新枚举时将 for 循环中的终止条件更新为最后一个“真实”枚举。如果您想稍后添加更多枚举,只需在 Last 之前添加它们。此示例中的循环仍然有效。当然,如果指定了枚举值,这将失效:
这说明枚举并不是真的要迭代。处理枚举的典型方法是在 switch 语句中使用它。
如果您真的想枚举,请将枚举值填充到向量中并对其进行迭代。这也将正确处理指定的枚举值。