c ++足够大的枚举

use*_*932 2 c++ enums c++11

我有一个很老的风格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)
  ;
Run Code Online (Sandbox Code Playgroud)

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

make_big_enough_integer应该返回val转换为整数类型int32_t,uint32_t或者uint64_t可以处理所有值enum.

注意1:转换为强类型枚举不是一个选项,因为它在程序的太多地方使用,并且无法想象可以替换其所有出现的正则表达式.

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

Jon*_*ely 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)
  ...
Run Code Online (Sandbox Code Playgroud)

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

enum Enum { e0, e1, e2 };
Run Code Online (Sandbox Code Playgroud)

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