2012-05-23 18 views
12

वहाँ एक प्रकार विशेषता है, या यह एक प्रकार विशेषता is_scoped_enum<T> ऐसी है कि लिखने के लिए संभव है: trueक्या यह निर्धारित करना संभव है कि कोई प्रकार एक स्कॉम्ड गणना प्रकार है या नहीं?

  • अगर T एक दायरे वाले गणन है, is_scoped_enum<T>::value है और
  • अगर T किसी भी अन्य प्रकार है, is_scoped_enum<T>::value है झूठी
+0

* स्कॉम्ड एनम * द्वारा, आपका मतलब सी ++ 11 की enum है? – Nawaz

+1

@ नवाज: एक स्कॉम्ड एनम सी ++ 11, हां में 'एनम क्लास' कहलाता है। –

+0

जिज्ञासा से बाहर, इस के लिए क्या व्यावहारिक अनुप्रयोग हैं? – Xeo

उत्तर

22

अगर यह एक enum और परोक्ष अंतर्निहित प्रकार चाल करना चाहिए के लिए परिवर्तनीय नहीं है मैं परीक्षण लगता है।

template <typename T, bool B = std::is_enum<T>::value> 
struct is_scoped_enum : std::false_type {}; 

template <typename T> 
struct is_scoped_enum<T, true> 
: std::integral_constant<bool, 
    !std::is_convertible<T, typename std::underlying_type<T>::type>::value> {}; 
+2

'int' के बजाय' std :: underlying_type 'बेहतर उपयोग करें। सी ++ 11 में एक 'एनम क्लास' कुछ 'परिवर्तनीय' पर परिवर्तनीय नहीं हो सकता है। – kennytm

+0

@ केनीटीएम अच्छा बिंदु। संपादित। –

+0

@ केनीटीएम: किस प्रकार का? सी ++ 11 §7.2/2 कहता है "_enum-base_ एक अभिन्न प्रकार का नाम देगा;" क्या एक अभिन्न प्रकार 'int' में परिवर्तनीय नहीं है? –

संबंधित मुद्दे