2012-01-30 14 views
19

Al utilizar enumeraciones fuertemente tipadas en una instrucción de conmutación ¿hay alguna manera de evitar conversiones explícitas a int?Conmutar sentencias con enumeraciones fuertemente tipadas

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

Desde el proyecto de n3242:

6.4.2 La sentencia switch [stmt.switch]

2 La condición debe ser de tipo integral, enumeración tipo, o de un tipo de clase para lo cual existe una única función de conversión no explícita a tipo integral o de enumeración (12.3).

¿Se tipo de enumeración incluyen inflexible de tipos enumeraciones o son incompatibles con switch declaraciones, ya que requieren una conversión explícita a int?

+1

http://ideone.com/ZEJcs - compila sin conversiones. –

+0

posible duplicado de [Encender la clase enum en C++ 0x] (http://stackoverflow.com/questions/6327223/switching-on-enum-class-in-c-0x) – lpapp

Respuesta

27

Un tipo de enumeración sigue siendo un tipo de enumeración, ya sea fuertemente tipado o no, y siempre funcionó bien en las declaraciones switch.

ver este programa, por ejemplo:

#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; 
    } 
} 

La salida de este es "A".

+0

¿No hay una manera de decir simplemente 'case A', etc., ¿tal vez con un declarativo' using'? – jiggunjer

+0

@jiggunjer Sí, es posible, por ej. 'usando E :: A;'. Sin embargo, eso atrae el símbolo 'A' en el ámbito actual (y ámbitos anidados, por supuesto), por lo que no puede tener otro símbolo llamado 'A 'en ningún otro lado. –

+0

Así que necesitaría un uso para cada miembro enumerado :( – jiggunjer

Cuestiones relacionadas