2010-05-25 8 views
7

मेरे पास एक टेम्पलेट है जिसे मैं दो 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(); } 
+0

क्या '#if COMPILING_FOR_64_BIT_PLATFORM' की तरह कुछ के साथ गलत क्या है: हालांकि, अपने उदाहरण सिर्फ शून्य मामले विशेषज्ञता द्वारा हल किया जा सकता है? (इसके अलावा, आपको विशेषज्ञता के रिटर्न प्रकारों को ठीक करने की आवश्यकता है।) – sbi

+1

यदि आप वास्तव में टेम्पलेट जादू का उपयोग करके ऐसा करना चाहते हैं, तो मुझे लगता है कि आप 'enable_if' के कुछ रूपों का उपयोग करके कुछ लेकर आ सकते हैं जो केवल' int' 'intptr_t' एक ही प्रकार के नहीं हैं। – sbi

+0

आपको प्रत्येक प्रकार के लिए टेम्पलेट को स्पष्ट रूप से विशेषज्ञ करने की आवश्यकता क्यों है? क्यों न केवल सभी प्रकार के 'टी' के लिए एक टेम्पलेट है जो 'getProperIntType (sizeof (T))' कहता है? यदि इस तरह से पूर्णांक प्रकारों को केवल संभालना महत्वपूर्ण है, तो आप SFINAE (google that) का उपयोग करके एक सहायक फ़ंक्शन को सौंप सकते हैं लेकिन चेतावनी दी जा सकती है: यह गन्दा है। –

उत्तर

2

आप क्या हासिल करने की कोशिश कर रहे हैं मौलिक असंभव है: intptr_t 32 बिट सिस्टम पर पूर्णांक के लिए एक typedef है, इसलिए संकलक उन्हें भेद नहीं कर सकते।

template<typename T> 
type * convert() { return getProperIntType(sizeof(T)); } 

template<> 
type * convert<void>() { return getProperVoidType(); } 
+0

तब बुरी खबरें। आपके समाधान के लिए, मुझे यह पसंद नहीं है कि यह चुपचाप सभी नए प्रकारों को int के रूप में इलाज कर रहा है। हालांकि मुझे लगता है कि यह किसी तरह के स्थिर दावे के साथ हल किया जा सकता है। – vava