c ++足够大的枚举

时间:2015-11-13 18:03:26

标签: c++ c++11 enums

我有一个很老的风格enum而不是c ++ 11强类型枚举, 我希望迭代它的值,如下所示:

enum Enum {
  enBEGIN = 0,
  eFirst,
  eSecond,
  //many lines
  enEND
};

Enum val;
for (auto i = make_big_enough_integer<Enum>(val); i != enEND; ++i)
  ;

问题是如何实施make_big_enough_integer 以最简单的方式?

make_big_enough_integer应该将val转换为整数类型int32_tuint32_tuint64_t,以便可以处理enum中的所有值

注1:转换为强类型枚举不是一种选择, 因为它被用于太多的程序, 并且无法想象可以取代所有出现的正则表达式。

注意2:我可以在循环之前插入,例如 这个static_cast(sizeof(Enum) <= sizeof(int), "error"); 或者只使用uint64_t,但我有兴趣将自动采用写入平台代码。

1 个答案:

答案 0 :(得分:5)

std::underlying_type<Enum>::type为您提供编译器选择的类型作为枚举所基于的基础整数类型,因此它与枚举的大小和表示完全相同。

using eut = std::underlying_type_t<Enum>;
for (eut i = std::numeric_limits<eut>::min(); i <= std::numeric_limits<eut>::max(); ++i)
  ...

N.B。这将迭代基础整数类型的全部值,这不一定与枚举类型的有效值范围相同。并非eut类型的每个值都是Enum类型的有效值,例如给出:

enum Enum { e0, e1, e2 };

基础类型可能是int,但枚举类型的唯一有效值是0,1,2和3.