Điều hiển nhiên là chú thích enum của bạn:
#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);
}
Bạn cần cập nhật mảng e
, điều này sẽ gây phiền toái nếu bạn không phải là tác giả của e
. Như Sjoerd nói, nó có thể được tự động hóa với bất kỳ hệ thống xây dựng tốt nào.
Trong mọi trường hợp, bạn đang chống lại mức 7.2 / 6:
Đối với kiểu liệt kê trong đó emin là điều tra viên nhỏ nhất và emax là lớn nhất, các giá trị của kiểu liệt kê là giá trị của kiểu cơ bản trong phạm vi bmin đến bmax, trong đó bmin và bmax lần lượt là giá trị nhỏ nhất và lớn nhất của giá trị nhỏ nhất trường bit có thể lưu trữ emin và emax. Có thể xác định một kiểu liệt kê có các giá trị không được xác định bởi bất kỳ kiểu liệt kê nào của nó.
Vì vậy, nếu bạn không phải là tác giả của e
, bạn có thể có hoặc không có đảm bảo rằng các giá trị hợp lệ e
thực sự xuất hiện trong định nghĩa của nó.
enum e{x = 10000};
không trong trường hợp này9999
rơi vào phạm vi củaenum
?