2016-10-01 9 views
16

क्या टेम्पलेट पैरामीटर एक एनम-क्लास प्रकार सुनिश्चित करने का कोई तरीका है?सुनिश्चित करें कि टेम्पलेट पैरामीटर एक enum class

मुझे पता है type_traits में std::is_enum है, लेकिन मैं नहीं चाहता कि यह नियमित enums, enum_classes से मेल खाता हो। वांछित प्रभाव के

उदाहरण:

enum class EnumClass {}; 
enum Enum {}; 
class Class {}; 

template <typename T> 
void Example() 
{ 
    static_assert(/* T is EnumClass */, "`T` must be an enum class"); 
} 

Example<EnumClass>(); // Ok 
Example<Enum>(); // Error 
Example<Class>(); // Error 

मैं सी ++ 11, और दुर्भाग्य से उपयोग कर रहा हूँ किसी भी उच्च नहीं जा सकते हैं (हालांकि मैं वैसे भी समाधान जानने के लिए उत्सुक हो जाएगा, भले ही वह नए मानक शामिल)।

क्या यह संभव है?

उत्तर

17

आप के साथ इसे प्राप्त कर सकते हैं:

template<typename T> 
using is_class_enum = std::integral_constant< 
    bool, 
    std::is_enum<T>::value && !std::is_convertible<T, int>::value>; 

Here एक डेमो।


आप SFINAE का उपयोग कर पसंद करते हैं, उसी के साथ प्राप्त किया जा सकता है:

template<typename T, typename _ = void> 
struct is_class_enum : std::false_type { 
}; 

template<typename T> 
struct is_class_enum < 
    T, 
    typename std::enable_if<std::is_enum<T>::value && 
          !std::is_convertible<T, int>::value>::type> : 
    public std::true_type { 
}; 
+0

मुझे सही अगर मैं गलत हूँ, लेकिन आप बस तथ्य के आधार पर कर रहे हैं कि enum कक्षाएं परोक्ष परिवर्तनीय नहीं हैं इंटीग्रल के लिए? एक निहित रूपांतरण ऑपरेटर को परिभाषित करना संभव नहीं है? –

+1

@ गिलादनाम आप 'एनम क्लास' से एक निहित ऑपरेटर को कैसे परिभाषित करते हैं? –

+0

हाँ, मेरा बुरा, आप वास्तव में 'एनम कक्षा' के अंदर ऑपरेटरों या कार्यों को परिभाषित नहीं कर सकते हैं। –

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