2012-01-30 118 views
19

在switch語句中使用強類型枚舉時,是否有避免顯式強制轉換爲int的方法?具有強類型枚舉的開關語句

/// @desc an enumeration of the states that the session can be in. 
enum class State 
{ 
    Created,  
    Connected, 
    Active, 
    Closed 
}; 

State sesState = session->GetState(); 

switch (static_cast<int>(sesState)) 
{ 
    case static_cast<int>(Session::State::Created): 
    // do stuff. 
    break; 

    case static_cast<int>(Session::State::Connected): 
    // do stuff. 
    break; 
} 

從n3242草案:

6.4.2 switch語句[stmt.switch]

2所述的條件應爲整體式,枚舉類型,或一個類類型的的爲此存在單個非顯式轉換函數爲整數或枚舉類型(12.3)。

是否枚舉類型包括強類型枚舉或者是他們不符合switch陳述,因爲它們需要一個明確的轉換int

+1

http://ideone.com/ZEJcs - 無需轉換即可編譯。 – 2012-01-30 10:17:41

+0

[在C++ 0x中切換枚舉類]可能重複(http://stackoverflow.com/questions/6327223/switching-on-enum-class-in-c-0x) – lpapp 2013-12-01 16:36:54

回答

27

枚舉類型仍然是一個枚舉類型,即使是強類型還是非類型,並且在switch語句中一直工作正常。

例如參見此程序:

#include <iostream> 

enum class E 
{ 
    A, 
    B 
}; 

int main() 
{ 
    E e = E::A; 

    switch (e) 
    { 
    case E::A: 
     std::cout << "A\n"; 
     break; 
    case E::B: 
     std::cout << "B\n"; 
     break; 
    } 
} 

的這個輸出是 「A」。

+0

是不是有一種方法可以說'情況A'等可能與'使用'聲明? – jiggunjer 2015-07-14 11:17:37

+0

@jiggunjer是的,有可能,例如, '使用E :: A;'。然而,當前範圍內的符號「A」(當然是嵌套的範圍),所以你不能在別的地方有另一個名稱爲「A」的符號。 – 2015-07-14 12:09:03

+0

所以你需要爲每個枚舉成員使用:( – jiggunjer 2015-07-14 13:56:57