Açık olan şey, numaranıza açıklama eklemektir:
#include <algorithm>
template <typename T>
struct enum_traits {};
template<typename T, size_t N>
T *endof(T (&ra)[N]) {
return ra + N;
}
template<typename T, typename ValType>
T check(ValType v) {
typedef enum_traits<T> traits;
const T *first = traits::enumerators;
const T *last = endof(traits::enumerators);
if (traits::sorted) {
if (std::binary_search(first, last, v)) return T(v);
} else if (std::find(first, last, v) != last) {
return T(v);
}
throw "exception";
}
enum e {
x = 1,
y = 4,
z = 10,
};
template<>
struct enum_traits<e> {
static const e enumerators[];
static const bool sorted = true;
};
const e enum_traits<e>::enumerators[] = {x, y, z};
int main() {
e good = check<e>(1);
e bad = check<e>(2);
}
Dizinin güncel tutulması gerekiyor e
ki bu, yazarı değilseniz bir sıkıntıdır e
. Sjoerd'in dediği gibi, muhtemelen herhangi bir düzgün inşa sistemi ile otomatikleştirilebilir.
Her durumda, 7.2 / 6'ya karşı çıkarsınız:
Emin'in en küçük numaralandırıcı olduğu ve emax'ın en büyük olduğu bir numaralandırma için, numaralandırmanın değerleri, bmin ve bmax'ın sırasıyla en küçük ve en büyük değerler olduğu bmin ila bmax aralığındaki temel tipin değerleridir. emin ve emax depolayabilen bit alanı. Numaralandırıcılarından herhangi biri tarafından tanımlanmamış değerlere sahip bir numaralandırma tanımlamak mümkündür.
Dolayısıyla, yazarı e
değilseniz, değerlerinin e
gerçekte tanımında göründüğüne dair bir garantiniz olabilir veya olmayabilir .
enum e{x = 10000};
Bu durumda yapar9999
aralığında düşecekenum
?