如何在C++11中循环遍历枚举类?

9

我应该如何在C++11中循环枚举类? 我希望我不必仍然添加一个最终枚举值END,但我也无法让基于范围的循环正常工作。


11
在我看来,enum 不是一个容器,因此“循环”它没有意义。无论如何,可以在这里查看算术部分的一些示例代码,你可以使用它们作为参考:https://bitbucket.org/martinhofernandes/wheels/src/c8e1b8979492/include/wheels/enums.h%2B%2B - Xeo
相关链接:https://dev59.com/KWoy5IYBdhLWcg3wg-Ym - Adrian McCarthy
2个回答

4

如果你真的需要遍历枚举类并且想要避免添加特殊的END符号,你可以为此定义自己的 traits。

template<typename E> struct EnumTraits;

enum class E { V1, V2, V3 };
enum class F { X1, X2, X3 };

template<> struct EnumTraits<E> { static constexpr E LAST = E::V3; };
template<> struct EnumTraits<F> { static constexpr F LAST = F::X3; };

然后你可以写例如:
EnumTraits<E>::LAST 

要得到E的“最终”值。 当然,您仍需要在此类上定义算术操作。


5
当然,这假设枚举从0开始,并且不跳过任何中间值。 - Lily Ballard
2
@KevinBallard:...这在许多情况下都不太可能发生。 - Ed S.
1
@EdS:这取决于枚举的目的。 - Lily Ballard
1
@KevinBallard:当然会,这就是为什么有“许多,许多情况”的原因。重点是这不是检索任意枚举的所有值的可靠方法。 - Ed S.
1
@EdS.:哦,抱歉,我误读了你的话。你是同意我的观点,而不是反对。对于造成的困惑,我感到抱歉。 - Lily Ballard
显示剩余2条评论

2
你可以像这样进行处理器黑客攻击:
#define E_INITIALIZER_LIST { E1, E2, E3, E4 }

enum E E_INITIALIZER_LIST;
constexpr E ALL_VALUES_OF_E[] E_INITIALIZER_LIST;

1
如果从宏中省略大括号,列表会更加灵活。然后,您还可以添加 SENTINEL_VALUE,将列表放入圆括号中等等。 - Potatoswatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接