2012-10-03 16 views
7

W jaki sposób należy zapętlić klasy enum w C++ 11? Mam nadzieję, że nadal nie muszę dodawać ostatecznej wartości wyliczeniowej END, ale nie mogłem również uruchomić pętli opartych na zasięgu.W jaki sposób należy zapętlić klasy enum w C++ 11?

+11

'enum' nie jest kontenerem - to nie ma sensu„pętla”nad nim, IMHO. W każdym razie zobacz część arytmetyczną [tutaj] (https://bitbucket.org/martinhofernandes/wheels/src/c8e1b8979492/include/wheels/enums.h%2B%2B), aby uzyskać przykładowy kod, którego możesz użyć. – Xeo

Odpowiedz

4

Jeśli naprawdę potrzebujesz pętli nad klasą wyliczania i chcesz uniknąć dodawania specjalnego symbolu END, możesz zdefiniować własne cechy do tego celu.

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

Następnie można napisać na przykład:

EnumTraits<E>::LAST 

dostać „ostateczną” wartość E. Oczywiście trzeba jeszcze zdefiniować operacje arytmetyczne w tej klasie.

+4

Oczywiście zakłada się, że wyliczenie rozpoczyna się od 0 i nie pomija żadnych pośrednich wartości. –

+2

@KevinBallard: ... Które jest mało prawdopodobne w wielu, wielu okolicznościach. –

+1

@EdS .: Zależy od celu enum –

2

Można zrobić procesor Hack tak:

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

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

Lista jest nieco bardziej elastyczna, jeśli pominięto nawiasy klamrowe z makra. Następnie możesz również dodać "SENTINEL_VALUE", zamiast tego umieść listę w nawiasach okrągłych itp. – Potatoswatter

Powiązane problemy