2013-04-20 13 views
6

Jaki byłby najlepszy sposób implementacji wyliczenia za pomocą wartości cyklicznych i odpowiednich funkcji do przejścia z wartości do drugiej?Implementacja wartości wyliczenia kołowego

Na przykład:

enum class Direction { 
    NORTH, EAST, SOUTH, WEST 
}; 

constexpr Direction left(Direction d) { 
    return (Direction)((std::underlying_type<Directions>::type(d) - 1) % 4); 
} 

Jednak czuję, że jest podatny na błędy i ogólnie nieczytelne. Czy istnieje lepszy sposób radzenia sobie z tego typu wyliczeniami?

+0

zaklęcie go jawnie z cztero- Oświadczenie switch case? To byłaby najbardziej czytelna opcja. – RichieHindle

+0

Co, jeśli istnieją DUŻO więcej wartości? – Svalorzen

+0

Bardziej czytelny dla mnie, jeśli zmienisz 'left' na' nextCounterclockwise' (lub może "nextCCW' w skrócie) :-D – deepmax

Odpowiedz

9

Zawsze możesz zrobić:

enum class Direction { 
    NORTH, EAST, SOUTH, WEST, NUMBER_OF_DIRECTIONS 
}; 

constexpr Direction left(Direction d) { 
    using ut = std::underlying_type<Direction>::type; 
    return (Direction)((ut(d) + ut(Direction::NUMBER_OF_DIRECTIONS)-1) 
         % ut(Direction::NUMBER_OF_DIRECTIONS)); 
} 

Wykorzystanie example/mały test:

#include <iostream> 

std::ostream& operator<<(std::ostream& os, Direction d) 
{ 
    switch(d) 
    { 
     case Direction::NORTH: return os << "NORTH"; 
     case Direction::EAST : return os << "EAST"; 
     case Direction::SOUTH: return os << "SOUTH"; 
     case Direction::WEST : return os << "WEST"; 
     default    : return os << "invalid"; 
    } 
} 

int main() 
{ 
    Direction d = Direction::NORTH; 
    for(int i = 0; i < 2*(int)Direction::NUMBER_OF_DIRECTIONS; ++i) 
    { 
     std::cout << d << "\n"; 
     d = left(d); 
    } 
} 

wyjściowa:

 
NORTH 
WEST 
SOUTH 
EAST 
NORTH 
WEST 
SOUTH 
EAST 

Live example

+0

Nie potrzebuje nawet dodatkowego elementu, po prostu wykonaj'% (std :: underlying_type :: type (WEST) + 1) '. Ale mimo wszystko wygląda jak szybka naprawa, prawda? – Svalorzen

+1

@Svalorzen: Tak, ale 'WEST + 1' nie jest tak naprawdę czytelny dla człowieka. A co się stanie, jeśli coś doda się po 'WEST'? Przynajmniej z 'NUMBER_OF_DIRECTIONS' jego zamiar jest jasny. –

+0

@PeterK. Mimo to, musiałbyś zrobić cały "basis_type" również na "NUMBER_OF_DIRECTIONS", więc byłby dość długi - i nie do odczytania. – Svalorzen

Powiązane problemy