我有一个很老的风格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_t
,uint32_t
或uint64_t
,以便可以处理enum
中的所有值
注1:转换为强类型枚举不是一种选择, 因为它被用于太多的程序, 并且无法想象可以取代所有出现的正则表达式。
注意2:我可以在循环之前插入,例如
这个static_cast(sizeof(Enum) <= sizeof(int), "error");
或者只使用uint64_t
,但我有兴趣将自动采用写入平台代码。
答案 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.