enum

2009-10-25 19 views
7

के लिए टेम्पलेट विशेषज्ञता एनम्स के लिए एक templatized विधि विशेषज्ञ करना संभव है?enum

(अवैध नीचे कोड) की तरह कुछ:

template <typename T> 
void f(T value); 

template <> 
void f<enum T>(T value); 

मामले में यह संभव नहीं है, फिर मान मैं प्रकार के एक नंबर के लिए विशेषज्ञता है, int, unsigned int, long long, unsigned long long, आदि, तो जैसे एन्युम वैल्यू किस विशेषज्ञता का उपयोग करेगा?

+0

http://stackoverflow.com/questions/29762892/how-to-specialize-a-template-function-for-enum-and-specific-type –

उत्तर

19

आप std::enable_if<type_traits> से इसे पूरा करने के लिए का उपयोग कर सकते हैं।

In an answer to one of my questions, litb ने बहुत पोस्ट किया है जो बूस्ट समकक्षों के साथ कैसे किया जा सकता है, इसकी विस्तृत और अच्छी तरह लिखित व्याख्या।

+0

यह लग रहा है जैसे यह काम कर सकता है। मैं इसे देख रहा हूँ। धन्यवाद! – nilton

6

मुझे यकीन है कि अगर मैं अपने प्रश्न सही ढंग से समझ नहीं कर रहा हूँ, लेकिन आप विशिष्ट enums पर टेम्पलेट का दृष्टांत कर सकते हैं:

template <typename T> 
void f(T value); 

enum cars { ford, volvo, saab, subaru, toyota }; 
enum colors { red, black, green, blue }; 

template <> 
void f<cars>(cars) { } 

template <> 
void f<colors>(colors) { } 

int main() { 
    f(ford); 
    f(red); 
} 
+2

यह काम नहीं करेगा क्योंकि मेरे पास पहले से enum प्रकार नहीं है। C12+ में – nilton

+0

आपके पास प्रकार है और इसलिए आप enum टेम्पलेट बना सकते हैं। एक अच्छा विषय enum (f ) के किसी विशेष मान के आधार पर टेम्पलेट बनाना होगा। कुछ ट्रिकर के साथ अभी भी संभव है या enum मूल्यों के बजाय कक्षाओं की घोषणा करके टाला जा सकता है। – GameDeveloper

1

मुमकिन है, केवल दिलचस्प बात यह है कि आप एक प्रकार है कि वे केवल आप बात के साथ कर सकता इसके बारे में पता है कि यह एक enum है, इसे अपने अंतर्निहित प्रकार में डाल दिया है और उस पर काम करते हैं। यहाँ कि कैसा लग सकता है कि कैसे, जेम्स 'का सुझाव दिया दृष्टिकोण (उर्फ SFINAE) का उपयोग कर रहा है:

void Bar(int b); // and/or other underlying types 

template<typename T> 
typename std::enable_if<std::is_enum<T>::value, void>::type 
Foo(T enm) 
{ 
    Bar(static_cast<typename std::underlying_type<T>::type>(enm)); 
} 

एक संबंधित बोनस के रूप में, यहाँ एक समान विधि है कि आपकी पसंद के केवल एक विशिष्ट प्रकार के लिए हल करेंगे (is_same में bool की जगह अपनी पसंद के प्रकार) के लिए:

template<typename T> 
typename std::enable_if<std::is_same<T,bool>::value, void>::type 
Baz(T bl) 
{ 
    if (bl) 
    { 
     //... 
    } 
    else 
    { 
     //... 
    } 
}