我有一个很老的风格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,但我有兴趣将自动采用写入平台代码.
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.
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |