2013-03-16 14 views
19

Wie wir wissen, ist die Inkrementierung und Dekrementierung von enum in C++ 03 illegal, weil C++ 03 enum möglicherweise nicht kontinuierlich ist. Aber der C++ 11-Standard führte die neue enum class-Konstruktion ein, die laut Wikipedia typsicherer ist, da sie nicht auf einem einfachen zählbaren Typ aufgebaut ist. So, jetzt, wenn wir eine beschränkte Liste von Werten eines ENUM haben, können wir etwas schreiben wieInkrementieren und Dekrementieren von "Enum-Klasse"

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

und wird es korrekt funktionieren (z Inkrementierung White kehrt Black und Dekrementierung von Black kehrt White)?

Wenn wir nicht einen solchen Code schreiben können, wissen Sie Verhalten artigen Klassen entweder aus boost oder von Qt, die uns zur Verfügung stellen diese Funktion (korrekte Ein- und Erniedrigen)?

+0

Es gibt nichts zu sagen, dass die Werte der Klasse enums zusammenhängend sind. Insofern entsprechen sie C++ 03 enums. – juanchopanza

+0

mögliches Duplikat von [Using enum in Schleifen und Wertkonsistenz] (http://stackoverflow.com/questions/13971544/using-enum-in-loops-and-value-consistency) –

+0

Eine weitere Frage hinzugefügt; Bitte lesen Sie. –

Antwort

20

wird es richtig

Nr enum s arbeiten, werden Sie nicht standardmäßig beschreiben in die Quere "um wrap" entworfen.

Und C++ 11's enum class garantiert keine zusammenhängenden Werte, die gleiche wie Sie für C++ 03's enum beschreiben.

Sie können jedoch das Wrapping-Verhalten für Ihre bestimmte Enum definieren. Diese Lösung setzt voraus, dass die Werte zusammenhängend sind, wie die von Ihnen beschriebene Enumeration.

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

Wie geht das mit nicht zusammenhängenden Werten um? – juanchopanza

+0

@juanchopanza nur in dem wir beobachten können, dass es keine gibt. –

+0

Also akzeptiert der Compiler 'color ++' für 'enum class' ohne implementierende Operatoren? –

Verwandte Themen