2012-01-30 7 views
19

switch 문에 강력한 형식의 열거 형을 사용하는 경우에는 int으로 명시 적 캐스트를 피할 수있는 방법이 있습니까? n3242 초안에서 강력한 형식의 열거 형을 사용하는 스위치 문

/// @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; 
} 

:

6.4.2 switch 문 [stmt.switch]

2 조건은 일체형, 열거 형 또는 클래스 타입이어야한다 정수 또는 열거 형에 대한 하나의 비 명시 적 변환 함수가 존재하는 경우 (12.3).

는 포함 열거 형은 강력하게 열거를 입력합니까하거나 int에 명시 적 변환을 필요로하기 때문에 그들은 switch 제표와 호환되지 않습니다?

+1

http://ideone.com/ZEJcs - 변환없이 컴파일합니다. –

+0

가능한 복제본 [C++ 0x의 enum 클래스 전환] (0120-336-005) – lpapp

답변

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

그냥 말할 방법이 없습니다. 'case A' 등을'using' 선언문과 함께 사용할 것인가? – jiggunjer

+0

@ jiggunjer 예, 가능합니다. 'E :: A;를 사용합니다. '. 그러나 현재 범위 (그리고 중첩 된 범위)에서 기호 A를 가져 오므로 다른 곳에는 A라는 다른 기호를 사용할 수 없습니다. –

+0

그래서 모든 열거 형 멤버에 대해 다음을 사용해야합니다. ( – jiggunjer