2012-10-03 24 views
7

C++ 11のenumクラスをどのようにループする必要がありますか?私はまだENDの最後のenum値を追加する必要はないと思っていますが、範囲ベースのループを使うことができませんでした。C++ 11ではenumクラスをどのようにループする必要がありますか?

+11

'enum'がコンテナではありません - それは意味がありません。それ以上の「ループ」、私見に。いずれにしても、使用できるコードの例については、[here](こちら)(https://bitbucket.org/martinhofernandes/wheels/src/c8e1b8979492/include/wheels/enums.h%2B%2B)を参照してください。 – Xeo

答えて

4

実際にenumクラスをループする必要があり、特殊なENDシンボルを追加したくない場合は、この目的のために独自の特性を定義できます。

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

その後、例えば書くことができます。

EnumTraits<E>::LAST 

あなたはまだ、このクラスで算術演算を定義する必要があります。もちろん、E. の「最終」の値を取得します。

+4

もちろん、これはenumが0から始まり、中間値をスキップしないことを前提としています。 –

+2

@KevinBallard:...多くの、多くの状況でそうなることはまずありません。 –

+1

@EdS:列挙型の目的に依存します。 –

2

あなたは、このようなプロセッサのハックを行うことができます。

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

enum E E_INITIALIZER_LIST; 
constexpr E ALL_VALUES_OF_E[] E_INITIALIZER_LIST; 
+1

マクロから中括弧を省略すると、リストの柔軟性が少し向上します。また、 'SENTINEL_VALUE'を追加したり、リストをラウンドカッコに入れたりすることもできます。 – Potatoswatter

関連する問題