स्पष्ट बात यह है कि आपके एनम को एनोटेट करना है:
#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);
}
e
यदि आप लेखक नहीं हैं, तो आपको एक तिथि के साथ रखने की आवश्यकता है , जो एक उपद्रव है e
। जैसा कि सोज़र्ड कहते हैं, यह संभवतः किसी भी सभ्य निर्माण प्रणाली के साथ स्वचालित हो सकता है।
किसी भी मामले में, आप 7.2 / 6 के खिलाफ हैं:
एक गणना के लिए जहां एमिन सबसे छोटा एन्यूमरेटर होता है और एमैक्स सबसे बड़ा होता है, एन्यूमरेशन के मान रेंज में bmax में अंतर्निहित प्रकार के मान होते हैं, जहां bmin और bmax क्रमशः सबसे छोटे और सबसे छोटे मान होते हैं बिट-फील्ड जो एमिन और इमैक्स को स्टोर कर सकता है। एक गणना को परिभाषित करना संभव है, जिसमें इसके किसी भी एन्यूमरेटर द्वारा परिभाषित मूल्य नहीं हैं।
इसलिए यदि आप इसके लेखक नहीं हैं, तो आपको इस बात की e
गारंटी हो सकती है कि e
वास्तव में इसकी परिभाषा में मान्य मूल्य दिखाई देते हैं या नहीं।
enum e{x = 10000};
इस मामले में9999
किसकी सीमा में आता हैenum
?