La cosa più ovvia è quella di annotare l'enum:
// generic code
#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) { // probably premature optimization
if (std::binary_search(first, last, v)) return T(v);
} else if (std::find(first, last, v) != last) {
return T(v);
}
throw "exception";
}
// "enhanced" definition of enum
enum e {
x = 1,
y = 4,
z = 10,
};
template<>
struct enum_traits<e> {
static const e enumerators[];
static const bool sorted = true;
};
// must appear in only one TU,
// so if the above is in a header then it will need the array size
const e enum_traits<e>::enumerators[] = {x, y, z};
// usage
int main() {
e good = check<e>(1);
e bad = check<e>(2);
}
È necessario la matrice per essere sempre aggiornati con e
, che è una seccatura se non sei l'autore di e
. Come dice Sjoerd, può probabilmente essere automatizzato con qualsiasi sistema di costruzione decente.
In ogni caso, sei contro 7.2/6:
Per un'enumerazione dove Emin è il più piccolo enumeratore ed Emax è il più grande , i valori della enumerazione sono i valori di il sottostante tipo nell'intervallo da bmin a bmax, dove bmin e bmax sono, rispettivamente, i valori più piccoli e più grandi del bit-field più piccolo che può memorizzare emin ed emax. È possibile definire un enumerazione che ha valori non definiti da uno qualsiasi dei suoi enumeratori.
Quindi, se non sei l'autore di e
, si può o non può avere una garanzia che i valori validi di e
appaiono in realtà nella sua definizione.
fonte
2010-11-12 14:42:10
'enum e {x = 10000};' in questo caso '9999' rientra nell'intervallo di' enum'? –
No, '9999' non cade. – Leonid
Buona domanda. Come per ogni "perché?" che sta per apparire, lasciami solo dire "deserializzazione" - mi sembra abbastanza una ragione. Sarei anche felice di sentire una risposta compilatore C++ 0x per 'enum class'. – Kos