2014-09-11 129 views
0

我讀過你不應該相信在被簽名或未簽名的情況下枚舉的底層實現。從這我得出結論,你應該總是把枚​​舉值轉換成它所比較的​​類型。像這樣:將枚舉與整數進行比較

enum MyEnum { MY_ENUM_VALUE = 0 }; 

int i = 1; 
if (i > static_cast<int>(MY_ENUM_VALUE)) 
{ 
    // do stuff 
} 

unsigned int u = 2; 
if (u > static_cast<unsigned int>(MY_ENUM_VALUE)) 
{ 
    // do more stuff 
} 

這是最佳做法嗎?

編輯:如果枚舉是匿名的,情況會改變嗎?

回答

0

簡短的回答:

enumsigned int型,但他們得到隱式轉換成unsigned int。你的編譯器可能會給出一個警告而沒有明確的轉換,但它仍然是非常常用的。不過,你應該明確地施展才能讓維護者清楚。當然,explicit cast will be must when its a strongly typed enum

+0

「枚舉符號int類型,但它們會隱式轉換爲無符號整型」這是錯誤的。非範圍的'enum'的基礎類型是一個整數類型,它可以適合最大的枚舉器。這意味着如果它大於'INT_MAX',它可以是'unsigned int','long','unsigned long'等。並且它隱式地轉換爲最小的整數類型,它可以適合最大的枚舉器(它是'總是'unsigned int')。 – Simple 2014-09-11 08:55:30

0

最佳做法是不要寫

int i = 1; 
if (i > static_cast<int>(MY_ENUM_VALUE)) 
{ 
    // do stuff 
} 

,而不是寫

MyEnumValue i = MY_ENUM_VALUE ; 
... 
if (i > MY_ENUM_VALUE) {..} 

但如果 - 在您的例子 - 你只需要在你的枚舉一個值最好是其聲明爲常數而不是枚舉。

+0

我同意這種情況主要出現在應該定義爲常量的值在枚舉中定義時。 – khuttun 2014-09-11 08:45:01

0

enum是一個整數,因此您可以針對任何其他整數進行比較,甚至漂浮。在比較之前,編譯器會自動將這兩個整數轉換爲最大值,或將enum轉換爲double值。

現在,如果你的枚舉不應該代表一個號碼本身,你可能要考慮創建一個類來代替:

enum class some_name { MY_ENUM_VALUE, ... }; 

int i; 
if(i == static_cast<int>(some_name::MY_ENUM_VALUE)) 
{ 
    ... 
} 

在你需要投這種情況下,因爲枚舉類不被視覺作爲默認的整數。這有助於頗有幾分避免的情況下,你是濫用枚舉值的錯誤...