मेरे पास एक टेम्पलेट है जिसे मैं दो int प्रकारों के साथ विशेषज्ञ बनाना चाहता हूं, उनमें से एक सादा पुराना int
और दूसरा एक intptr_t
है। 64 बिट प्लेटफ़ॉर्म पर उनके पास अलग-अलग आकार होते हैं और मैं आसानी से ऐसा कर सकता हूं लेकिन 32 बिट पर दोनों प्रकार समान हैं और कंपाइलर पुनर्वितरण के बारे में एक त्रुटि फेंकता है। प्रीप्रोसेसर के साथ परिभाषाओं में से एक को अक्षम करने के अलावा इसे ठीक करने के लिए मैं क्या कर सकता हूं?32 और 64 बिट वातावरण में intptr_t के साथ टेम्पलेट को विश्वसनीय रूप से कैसे विशेषज्ञता दें?
एक उदाहरण के रूप में कुछ कोड:
template<typename T>
type * convert();
template<>
type * convert<int>() { return getProperIntType(sizeof(int)); }
template<>
type * convert<intptr_t>() { return getProperIntType(sizeof(intptr_t)); }
//this template can be specialized with non-integral types as well,
// so I can't just use sizeof() as template parameter.
template<>
type * convert<void>() { return getProperVoidType(); }
क्या '#if COMPILING_FOR_64_BIT_PLATFORM' की तरह कुछ के साथ गलत क्या है: हालांकि, अपने उदाहरण सिर्फ शून्य मामले विशेषज्ञता द्वारा हल किया जा सकता है? (इसके अलावा, आपको विशेषज्ञता के रिटर्न प्रकारों को ठीक करने की आवश्यकता है।) – sbi
यदि आप वास्तव में टेम्पलेट जादू का उपयोग करके ऐसा करना चाहते हैं, तो मुझे लगता है कि आप 'enable_if' के कुछ रूपों का उपयोग करके कुछ लेकर आ सकते हैं जो केवल' int' 'intptr_t' एक ही प्रकार के नहीं हैं। – sbi
आपको प्रत्येक प्रकार के लिए टेम्पलेट को स्पष्ट रूप से विशेषज्ञ करने की आवश्यकता क्यों है? क्यों न केवल सभी प्रकार के 'टी' के लिए एक टेम्पलेट है जो 'getProperIntType (sizeof (T))' कहता है? यदि इस तरह से पूर्णांक प्रकारों को केवल संभालना महत्वपूर्ण है, तो आप SFINAE (google that) का उपयोग करके एक सहायक फ़ंक्शन को सौंप सकते हैं लेकिन चेतावनी दी जा सकती है: यह गन्दा है। –