2013-04-20 33 views
6

Dairesel değerler ile bir numaralandırma ve bir değerden diğerine geçiş için uygun işlevlerin uygulanmasının en iyi yolu ne olurdu? ÖrneğinDairesel enum değerlerinin uygulanması

:

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

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

Ancak, bu hata eğilimli ve genellikle okunmaz olduğunu düşünüyoruz. Bu tür sayılar ile başa çıkmak için daha uygun bir yolu var mı?

+0

bir dört-ile açıkça heceleyin durum açıklaması? Bu en okunabilir seçenek olurdu. – RichieHindle

+0

Eğer LOTS daha fazla değer varsa? – Svalorzen

+0

Eğer 'left' - nextCounterclockwise '(ya da belki 'nextCCW' kısa) değiştirirseniz benim için daha okunaklı: -D – deepmax

cevap

9

Hep yapabilirdi:

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)); 
} 

Kullanım örneği/küçük testi:

#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); 
    } 
} 

Çıktı:

 
NORTH 
WEST 
SOUTH 
EAST 
NORTH 
WEST 
SOUTH 
EAST 

Live example

+0

Bu ek öğeye bile gerekmiyor, sadece' 'yapmak için' '% (std :: underlying_type :: türü (WEST) + 1) '. Ama yine de, hızlı bir düzeltme gibi görünüyor değil mi? – Svalorzen

+1

@Svalorzen: Evet, ancak "WEST + 1" gerçekten insan tarafından okunabilir değildir. Ve WEST'den sonra bir şey eklenirse ne olur? En azından 'NUMBER_OF_DIRECTIONS' ile amacı açık. –

+0

@PeterK. Yine de, tüm 'underlying_type' işlevini 'NUMBER_OF_DIRECTIONS' değerine de eklemeniz gerekecek, bu yüzden de oldukça uzun olacak - ve bu da okunabilir değil. – Svalorzen