【发布时间】:2012-10-03 19:49:01
【问题描述】:
我应该如何循环 C++11 中的枚举类?我希望我仍然不必添加 END 的最终枚举值,但我也无法让基于范围的循环工作。
【问题讨论】:
-
enum不是一个容器——“循环”它没有意义,恕我直言。在任何情况下,请参阅算术部分 here 以获取您可以使用的一些示例代码。
我应该如何循环 C++11 中的枚举类?我希望我仍然不必添加 END 的最终枚举值,但我也无法让基于范围的循环工作。
【问题讨论】:
enum 不是一个容器——“循环”它没有意义,恕我直言。在任何情况下,请参阅算术部分 here 以获取您可以使用的一些示例代码。
如果您确实需要遍历枚举类并且希望避免添加特殊的 END 符号,您可以为此目的定义自己的特征。
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 的“最终”值。 当然你还需要在这个类上定义算术运算。
【讨论】:
你可以像这样对处理器进行破解:
#define E_INITIALIZER_LIST { E1, E2, E3, E4 }
enum E E_INITIALIZER_LIST;
constexpr E ALL_VALUES_OF_E[] E_INITIALIZER_LIST;
【讨论】:
SENTINEL_VALUE,将列表放入圆括号中,等等。