Executing Loop Enumeration Values

What would be the best way to implement an enumeration with circular values ​​and the corresponding functions for moving from a value to another?

For instance:

enum class Direction { NORTH, EAST, SOUTH, WEST }; constexpr Direction left(Direction d) { return (Direction)((std::underlying_type<Directions>::type(d) - 1) % 4); } 

However, I feel that this is a tendency to make mistakes and is generally unreadable. Is there a better way to deal with these types of transfers?

+6
source share
1 answer

You can always do:

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

Usage example / small 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); } } 

Output:

  North
 WEST
 SOUTH
 East
 North
 WEST
 SOUTH
 East

Living example

+9
source

All Articles