Xavier
Xavier

Reputation: 9059

How should I loop over an enum class in C++11?

How should I loop over an enum class in C++11? I'm hoping I still don't have to add a final enum value of END but I couldn't get the range based looping to work either.

Upvotes: 9

Views: 13184

Answers (2)

Isaac Pascual
Isaac Pascual

Reputation: 492

You can do processor hack like this:

#define E_INITIALIZER_LIST { E1, E2, E3, E4 }

enum E E_INITIALIZER_LIST;
constexpr E ALL_VALUES_OF_E[] E_INITIALIZER_LIST;

Upvotes: 2

witosx
witosx

Reputation: 624

If you really need to loop over enum class and you want to avoid adding special END symbol, you can define your own traits for this purpose.

template<typename E> struct EnumTraits;

enum class E { V1, V2, V3 };
enum class F { X1, X2, X3 };

template<> struct EnumTraits<E> { static constexpr E LAST = E::V3; };
template<> struct EnumTraits<F> { static constexpr F LAST = F::X3; };

Then you can write for example:

EnumTraits<E>::LAST 

to get "final" value of E. Of course you still need to define arithmetic operations on this class.

Upvotes: 4

Related Questions