2013-04-20 43 views
6

Cách tốt nhất để thực hiện một liệt kê với các giá trị tròn và các hàm thích hợp để chuyển đổi từ một giá trị này sang giá trị khác là gì?Thực hiện các giá trị enum tròn

Ví dụ:

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

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

Tuy nhiên, tôi cảm thấy rằng đây là lỗi dễ bị và thường không đọc được. Có cách nào thích hợp hơn để đối phó với loại liệt kê này không?

+0

chính tả nó ra một cách rõ ràng với một bốn trường hợp chuyển đổi tuyên bố? Đó sẽ là lựa chọn dễ đọc nhất. – RichieHindle

+0

Điều gì xảy ra nếu có nhiều giá trị hơn LOTS? – Svalorzen

+0

Có thể đọc được nhiều hơn cho tôi nếu bạn thay đổi 'left' thành' nextCounterclockwise' (hoặc có thể 'nextCCW' trong ngắn) :-D – deepmax

Trả lời

9

Bạn luôn có thể làm:

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

Cách sử dụng ví dụ/thử nghiệm nhỏ:

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

Output:

 
NORTH 
WEST 
SOUTH 
EAST 
NORTH 
WEST 
SOUTH 
EAST 

Live example

+0

Nó thậm chí sẽ không cần phần tử bổ sung, chỉ cần'% (std :: bases_type :: gõ (WEST) + 1) '. Tuy nhiên, nó trông giống như một sửa chữa nhanh chóng phải không? – Svalorzen

+1

@Svalorzen: Yup, nhưng 'WEST + 1' không thực sự dễ đọc. Và điều gì xảy ra nếu một thứ gì đó được thêm vào sau 'WEST'? Ít nhất với 'NUMBER_OF_DIRECTIONS' ý định của nó là rõ ràng. –

+0

@PeterK. Tuy nhiên, bạn cũng cần phải thực hiện toàn bộ 'inner_type' thành' NUMBER_OF_DIRECTIONS', vì vậy nó sẽ khá dài - và cũng không thể đọc được. – Svalorzen

Các vấn đề liên quan