2013-10-30 51 views
1

我有一個暴露枚舉的類。我想檢查值的有效性在setter函數,就像這樣:檢查枚舉的有效性

enum abc 
{ 
    X, 
    Y 
}; 

int my_class::set_abc(abc value) 
{ 
    if(static_cast<int>(value) > static_cast<int>(Y)) 
     return -1; 
... 
} 

沒有爲值是類似的檢查不到十

我看到,編譯器會完全刪除檢查。我有谷歌搜索的原因,並遇到了許多頁面解釋C++整數轉換的規則,但我不會找到任何關於將枚舉轉換爲整數或檢查有效性的澄清。

完成此操作的正確方法是什麼?

回答

1

由於01是類型abc,誰通過在一個值大於或小於具有已經爲了創建它調用未定義的行爲的唯一有效的值。

您不能輕易在C++中編寫代碼來檢測之前導致UB的條件 - 正如您所看到的,編譯器傾向於根據語言允許或禁止的內容進行優化。

你可以寫一個int過載,檢查值,然後轉換爲枚舉類型的功能,而不用費心在abc超載檢查,因爲這是別人的問題,以避免調用UB。

或者,您可以通過在枚舉中放入一些任意的附加值來避免測試過多。然後編譯器不能刪除它。

2

這似乎是任意測試Y,所以我會添加一些限制。這還允許您在最小和最大之間添加更多元素,而不必關心排序。

enum abc 
{ 
    ABC_MIN = 0, 
    X, 
    Y, 
    ABC_MAX 
}; 

int my_class::set_abc(abc value) 
{ 
    assert(value > ABC_MIN && value < ABC_MAX); 
{ 
0

在C++中,不能直接將整數賦值給enum變量,而無需顯式強制轉換。

如果您的代碼使用enum類型無處不在,那麼沒有必要檢查它是否有效。它應該從一開始就有效並且應該保持有效。

但是,如果您的代碼以整數形式獲取值,並且您需要將其轉換爲enum(或者對enum值進行算術運算),那麼您應該驗證該網站的值。