2013-03-16 19 views
19

Jak wiemy, inkrementacja i dekrementacja enum w C++ 03 jest nielegalna, ponieważ C++ 03 enum może nie być ciągła. Ale standard C++ 11 wprowadził nową konstrukcję enum class, która według Wikipedii jest bardziej bezpieczna dla typów, ponieważ nie jest zbudowana na żadnym prostym rodzaju policzalnym. Więc teraz, jeśli mamy ograniczony wykaz wartości wyliczenia, możemy napisać coś podobnegoInkrementacja i dekrementacja "klasy enum"

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

i będzie działać prawidłowo (np zwiększanie stanu White powróci Black i dekrementacja z Black powróci White)?

Jeśli nie możemy napisać taki kod, znasz jakieś zajęcia podobnego zachowania albo z boost lub z Qt które zapewniają nam tę funkcję (poprawne in- i dekrementacyjny o wartości)?

+0

Nie ma nic do dodania, że ​​wartości wyliczenia klas są ciągłe. Pod tym względem są one takie same jak wyliczenia C++ 03. – juanchopanza

+0

możliwy duplikat [Używanie enum w pętlach i spójność wartości] (http://stackoverflow.com/questions/13971544/using-enum-in-loops-and-value-conistency) –

+0

Dodano jeszcze jedno pytanie; proszę przeczytaj. –

Odpowiedz

20

będzie działać poprawnie

nr enum s nie są przeznaczone do "wrap around" w sposób opisujesz domyślnie.

I C++ 11's enum class nie gwarantuje wartości sąsiednich, tak samo jak opisano dla C++ 03's enum.

Można zdefiniować zachowanie zawijania dla konkretnego wyliczenia. To rozwiązanie zakłada, że ​​wartości są ciągłe, podobnie jak enum, które opisałeś.

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

W jaki sposób radzi sobie z nieciągłymi wartościami? – juanchopanza

+0

@juanchopanza tylko w tym, że możemy zaobserwować, że ich nie ma. –

+0

Więc kompilator akceptuje 'color ++' dla 'enum class' bez implementowania operatorów? –