【问题标题】:How should I loop over an enum class in C++11?我应该如何遍历 C++11 中的枚举类?
【发布时间】:2012-10-03 19:49:01
【问题描述】:

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

【问题讨论】:

  • enum 不是一个容器——“循环”它没有意义,恕我直言。在任何情况下,请参阅算术部分 here 以获取您可以使用的一些示例代码。

标签: c++ enums c++11


【解决方案1】:

如果您确实需要遍历枚举类并且希望避免添加特殊的 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 的“最终”值。 当然你还需要在这个类上定义算术运算。

【讨论】:

  • 当然,这假设枚举从 0 开始并且不跳过任何中间值。
  • @KevinBallard:......在很多很多情况下都不太可能发生这种情况。
  • @EdS.:取决于枚举的目的
  • @KevinBallard:当然可以,因此是 “很多很多情况” 位。要点是这不是检索任意枚举的所有值的可靠方法。
  • @EdS.:哦,对不起,我看错了你说的话。你同意我的观点,而不是不同意。很抱歉造成混乱。
【解决方案2】:

你可以像这样对处理器进行破解:

#define E_INITIALIZER_LIST { E1, E2, E3, E4 }

enum E E_INITIALIZER_LIST;
constexpr E ALL_VALUES_OF_E[] E_INITIALIZER_LIST;

【讨论】:

  • 如果您从宏中省略大括号,该列表会更灵活一些。然后你也可以添加一个SENTINEL_VALUE,将列表放入圆括号中,等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2010-12-12
  • 2011-09-01
相关资源
最近更新 更多