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?
Odpowiedz
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.
Oczywiście zakłada się, że wyliczenie rozpoczyna się od 0 i nie pomija żadnych pośrednich wartości. –
@KevinBallard: ... Które jest mało prawdopodobne w wielu, wielu okolicznościach. –
@EdS .: Zależy od celu enum –
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;
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
'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