2014-11-05 22 views
7

sto cercando di attivare un-enum ambito con il tipo unsigned int:Accensione enum ambito

L'enumerazione è definito come:

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

ho ricevuto un const unsigned riferimento int e sono cercando di verificare quel valore rispetto ai valori enum.

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

    .... 

    default: 
     .... 
    } 
} 

Questo si traduce in un errore di sintassi: Error: This constant expression has type "EnumType" instead of the required "unsigned int" type.

Ora, utilizzando un static_cast su ogni interruttore, come ad esempio:

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

correzioni l'errore di sintassi, anche se la fusione ad ogni istruzione case doesn sembra un buon modo per farlo. Ho davvero bisogno di lanciare in ogni caso, o c'è un modo migliore?

+0

A mio parere, il punto principale delle enumerazioni fortemente tipizzate è che sono ... beh, fortemente tipizzate, quindi nessuna conversione implicita. Quindi sì, devi cast. EDIT: Vedo ora che non stavi chiedendo se è necessario eseguire il cast, ma se è necessario eseguire il cast per ogni caso. Scusa colpa mia. – antred

risposta

10

È possibile risolvere questo lanciando la variabile interruttore stesso per EnumType:

switch (static_cast<EnumType>(num)) { 

(Demo)

Lo scopo di enumerazioni scoped è quello di farli fortemente tipizzato. A tal fine, non ci sono conversioni implicite da o verso il tipo sottostante. Devi convertire la variabile switch o le case switch. Suggerirei di convertire la variabile switch in quanto richiede meno codice e quindi renderà più semplice la manutenzione.

IMO la soluzione corretta sarebbe modificare la funzione per accettare const EnumType & (o solo EnumType).