2014-11-05 94 views
7

我想上的作用域-枚舉與該無符號整型切換:接通作用域枚舉

const enum struct EnumType : unsigned int { SOME = 1, MORE = 6, HERE = 8 }; 

我接收一個const unsigned int的參考,我:

作爲枚舉定義試圖根據枚舉值檢查該值。

void func(const unsigned int & num) 
{ 
    switch (num) 
    { 
    case EnumType::SOME: 
     .... 
     break; 
    case EnumType::MORE: 
     .... 
     break; 

    .... 

    default: 
     .... 
    } 
} 

這將導致一個語法錯誤:Error: This constant expression has type "EnumType" instead of the required "unsigned int" type.

現在,每個交換機上使用static_cast,如:

case static_cast<unsigned int>(EnumType::SOME): 
    .... 
    break; 
case static_cast<unsigned int>(EnumType::MORE): 
    .... 
    break; 

修復語法錯誤,雖然在每種情況下,聲明沒有按鑄造看起來這不是一個好辦法。我是否真的需要在每種情況下施放,還是有更好的方法?

+0

在我看來強類型枚舉的整點是,他們是......嗯,強類型,所以沒有隱式轉換。所以是的,你需要投。 編輯:我現在看到你不是問你是否需要施放,而是你是否需要施放每個案例。對不起這是我的錯。 – antred 2014-11-05 22:24:50

回答

10

您可以通過開關變量本身鑄造EnumType解決這個問題:

switch (static_cast<EnumType>(num)) { 

Demo

範圍的枚舉的目的是讓他們強類型。爲此,不存在對基礎類型的隱式轉換。您必須轉換開關變量或開關箱。我建議轉換開關變量,因爲這需要更少的代碼,因此將使維護更容易。

IMO的正確解決方案將改爲接受const EnumType &(或只是EnumType)的功能。