2015-11-13 110 views
2

我有很大的老式enum不是C++ 11强类型枚举, 我要重复,虽然它的值,如:C++足够大的整数,枚举

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_tuint64_t所以可以处理在enum所有值。

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

注2:我可以循环之前插入,像 这static_cast(sizeof(Enum) <= sizeof(int), "error"); 或只使用uint64_t,但我有趣的写汽车采用以平台的代码。

+1

您是否在寻找'的std :: underlying_type'? –

回答

5

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

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

+0

是的,看着type_traits,但std :: unerlying_type不吸引我的注意力。 – user1244932