2015-11-13 52 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