2013-07-22 14 views
5

Istnieje wiele sposobów na iterację kolejne teksty stałe jakiterację zakaz kolejnych elementów enum w C++

enum Animal {Cat, Dog, Dolphin} 

ale jest wygodny i łatwy sposób wykonać iterację zakaz kolejnych elementów enum jak

enum Animal {Cat = 0, Dog = 5, Dolphin = 8} 
+0

Nie w "enum" bezpośrednio. Jednak możesz ręcznie umieścić wszystkie elementy 'enum' w kontenerze (' vector', 'set',' unordered_set', cokolwiek ...), a następnie iterować po tym kontenerze. – syam

+0

Masz na myśli, że chcesz czegoś takiego jak 'dla (Animal a = Cat; a! = Dolphin; a ++)'? Chociaż działa to przy pierwszym wyliczaniu, nie jest to coś, co osobiście poleciłbym, ponieważ może być trudne do odczytania i zrozumienia. –

+2

Możesz znaleźć odpowiedź w tym wątku http: // stackoverflow.com/questions/261963/how-can-i-iterate-over-an-enum. – blitz

Odpowiedz

2

Krótka odpowiedź brzmi "nie".

Można utworzyć tabelę animals, a następnie użyć pętli zasięgu na animals.

Oto pełna "demo":

#include <iostream> 

using namespace std; 

enum Animal {Cat = 0, Dog = 5, Dolphin = 8}; 

int main() 
{ 
    Animal animals[] = { Cat, Dog, Dolphin }; 

    for(Animal a : animals) cout << a << endl; 
} 

wyjście będzie:

0 
5 
8 
0

nie jestem pewien, że pytanie nawet sens. To jest na jakimkolwiek poziomie stopy fundamentalnie niemożliwe. Rozważmy:

enum Animal 
{ 
    cat = 0, 
    dog = 5, 
    dolphin = 8, 
    canine = 5, 
    bear = 20 
}; 

Gdy wartość bazową jest 5, nie masz możliwości określania czy został ustawiony przez dog lub przez canine, i tak nie sposób wiedząc, czy następna wartość powinna być dolphin lub bear. Można umieścić wartości w tablicy i powtórzyć nad tym, ale Nie widzę innego rozwiązania.

W ogóle, oczywiście, większość czasu będziesz się wyraźnie wartości wpływające tak to jesteś definiowanie maskę bitową (np jak std::ios_base::fmtflags), w tym przypadku, to nie ma sensu do iteracji . Inne przypadki, o których mogę pomyśleć, to: specjalne wartości sentencji (np. Coś podobnego do unset), które prawdopodobnie chcesz pominąć podczas iteracji lub synonimów (np. Mój przykład dog/canine), w takim przypadku, " d prawdopodobnie tylko chcesz odwiedzić jeden z synonimów i realistycznie, to bym napisać coś takiego:

enum Animal 
{ 
    cat, 
    dog, 
    canine = dog, 
    dolphin, 
    bear 
}; 

i zwykłe sztuczki iteracji spowodowałoby właśnie chcesz.

1

Można również dostarczyć niezbędnej operatora (-ów) dla wyliczenia:

enum Animal 
{ 
    Cat = 0 
    , Dog = 5 
    , Dolphin = 8 
}; 

inline Animal& operator++ (Animal &x) 
{ 
    switch (x) { 
    case Cat: 
     x = Dog; 
     break; 
    case Dog: 
     x = Dolphin; 
     break; 
    case Dolphin: 
    default: 
     x = static_cast<Animal>(static_cast<int>(x) + 1); 
     break; 
    } 
    return x; 
} 

DTTO postfixa ++, < i cokolwiek innego, czego potrzebujesz. Oczywiście musisz je zsynchronizować z definicją wyliczenia. Niezbyt proste, ale jest to opcja.