2013-03-16 14 views
19

Come sappiamo, l'incremento e il decremento di enum in C++ 03 non sono consentiti, poiché C++ 03 enum potrebbe non essere continuo. Ma lo standard C++ 11 ha introdotto la nuova costruzione enum class, che, secondo Wikipedia, è più sicura dal punto di vista del tipo perché non è costruita su alcun tipo numerabile semplice. Così ora, se abbiamo un elenco limitato di valori di un enum, possiamo scrivere qualcosa comeIncremento e decremento della "classe enum"

enum class Colors { Black, Blue, White }; 
// ... 
Colors color = Colors::White; 
color++; 

e c'è funzionare correttamente (ad esempio Incremento delle White tornerà Black e decremento di Black tornerà White)?

Se non possiamo scrivere tale codice, fai a sapere tutte le classi di comportamento simile sia da boost o da Qt che ci forniscono questa funzione (corretta in- e decremento)?

+0

Non c'è niente da dire che i valori delle enumerazioni di classe siano contigui. In questo senso, sono uguali alle enumerazioni di C++ 03. – juanchopanza

+0

possibile duplicato di [Utilizzo di enum in cicli e coerenza dei valori] (http://stackoverflow.com/questions/13971544/using-enum-in-loops-and-valor-consistency) –

+0

Aggiunta un'altra domanda; si prega di leggere. –

risposta

20

funzionerà correttamente

No. enum s non sono progettati per "wrap around" nel modo in cui si descrivono per impostazione predefinita.

E C++ 11 di enum class non garantisce valori contigui, lo stesso come lei per C++ 03 di enum.

Tuttavia è possibile definire il comportamento di avvolgimento per il proprio enum. Questa soluzione presuppone che i valori siano contigui, come l'enumerazione che hai descritto.

enum class Colors { Black, Blue, White, END_OF_LIST }; 

// Special behavior for ++Colors 
Colors& operator++(Colors &c) { 
    using IntType = typename std::underlying_type<Colors>::type 
    c = static_cast<Colors>(static_cast<IntType>(c) + 1); 
    if (c == Colors::END_OF_LIST) 
    c = static_cast<Colors>(0); 
    return c; 
} 

// Special behavior for Colors++ 
Colors operator++(Colors &c, int) { 
    Colors result = c; 
    ++c; 
    return result; 
} 
+0

In che modo questo fa fronte ai valori non contigui? – juanchopanza

+0

@juanchopanza solo in quanto possiamo osservare che non ce ne sono. –

+0

Quindi il compilatore accetta 'color ++' per 'enum class' senza implementare gli operatori? –

Problemi correlati