हां, यह है ... लेकिन शायद यह आपके द्वारा अपेक्षित तरीके से काम नहीं करेगा।
template < typename T >
void foo()
{
if (is_same<T,SomeClass>::value) ...;
else if (is_same<T,SomeClass2>::value) ...;
}
आप अपनी इच्छा/संकलक पर निर्भर करता है std::
या boost::
से is_same
मिल सकती है। पूर्व केवल सी ++ 0x में है।
समस्या ...
में क्या है के साथ आता है। यदि आप foo के भीतर उन प्रकारों के लिए विशिष्ट कुछ फ़ंक्शन कॉल करने में सक्षम होने की उम्मीद करते हैं, तो आप दुखी हैं। एक कंपाइलर त्रुटि तब भी परिणाम देगी जब कोड का वह अनुभाग कभी नहीं चलाया जाता है जब आप किसी ऐसे इंटरफ़ेस का पालन नहीं करते हैं जो उस अपेक्षित इंटरफ़ेस का पालन नहीं करता है।
उस समस्या को हल करने के लिए आपको कुछ अलग करने की आवश्यकता है। मैं टैग भेजने की सलाह देते हैं:
struct v1_tag {};
struct v2_tag {};
template < typename T > struct someclass_version_tag;
template < > struct someclass_version_tag<SomeClass> { typedef v1_tag type; };
template < > struct someclass_version_tag<SomeClass2> { typedef v2_tag type; };
void foo(v1_tag) { ... }
void foo(v2_tag) { ... }
template < typename T > void foo()
{
typedef typename someclass_version_tag<T>::type tag;
foo(tag());
}
ध्यान दें कि आप किसी भी क्रम-बहुरूपता भूमि के ऊपर यहाँ पीड़ित नहीं किया जाएगा और अनुकूलन के साथ यह चालू ही या यहाँ तक कि छोटे कोड आकार और गति में (हालांकि आप shouldn 'परिणाम चाहिए इस बारे में चिंता न करें जब तक कि आप एक प्रोफाइलर नहीं चलाते)।
स्रोत
2010-12-23 21:01:01
क्या संस्करण_टैग के आधार पर विभिन्न प्रकारों को वापस करना संभव है? – Boying
निश्चित रूप से। यदि आप सी ++ 03 में फंस गए हैं, या सी ++ 11 और ऊपर में ऑटो का उपयोग करते हैं, तो आपको जानकारी पूछने के लिए कुछ तरीके से आने की आवश्यकता है। जब तक आप एक ही तत्कालता के भीतर विभिन्न प्रकारों को वापस करने की कोशिश नहीं करते हैं, तब तक आपको कोई समस्या नहीं होगी। –
अब सी ++ 17 के साथ, यदि आप इसे छोटे से करने के लिए कथन करते हैं तो आप constexpr का उपयोग कर सकते हैं – xaxxon