2010-01-13 10 views
7

से प्राप्त होता है मैं एक समस्या हल करने की कोशिश कर रहा था, लेकिन एक अलग समाधान मिला। ,सी ++ विशेष टेम्पलेट गैर-विशिष्ट संस्करण

template<class> struct S; 
template< > struct S<Foo> : struct<Foo> {}; 

मैं nonspecialized struct के वारिस के लिए सक्षम होना चाहते हैं struct.the उदाहरण विशेष से काम नहीं करता है क्योंकि विरासत में मिला struct विशेष है ऊपर अग्रणी: लेकिन जिज्ञासा से बाहर है, तो निम्न संभव है जानना चाहते अनंत पुनरावृत्ति के लिए।

एक संभावित समाधान दूसरा टेम्पलेट पैरामीटर जोड़ने के लिए था, बूल विशेष कहता है, जैसे कि डिफ़ॉल्ट गलत है, और विशेष टेम्पलेट में पैरामीटर सत्य है। हालांकि यह चीजों को थोड़ा गन्दा बनाता है क्योंकि तत्काल को अतिरिक्त पैरामीटर निर्दिष्ट करने की आवश्यकता होती है।

क्या उपर्युक्त को लागू करने के लिए कोई अन्य तरीका है?

मूल समस्या मैट्रिक्स के मैट्रिक्स को कार्यान्वित करना था, जहां मैट्रिक्स के पास अतिरिक्त ऑपरेटर हो सकते हैं, इस पर निर्भर करता है कि घटक मैट्रिक्स में उन ऑपरेटरों हैं। मुझे उम्मीद है कि यह समझ में आता है। साथ ही विभिन्न टेम्पलेट पैरामीटर के साथ, एक ही समय में एक ही नाम को बनाए रखने के लिए अलग-अलग विशेष मैट्रिक्स को एक ही बेस क्लास की आवश्यकता होती है। मैंने सोचा था कि है यह करने के लिए एक तरह से enable_if और प्रकार का उपयोग हो सकता है लक्षण

+3

पहला काउंटर-सवाल यह है कि आप किस प्रकार की समस्या को हल करने की कोशिश कर रहे हैं? –

उत्तर

2

एक संभव समाधान दूसरा टेम्पलेट पैरामीटर जोड़ने के लिए किया गया था, का कहना है कि bool विशेष, डिफ़ॉल्ट गलत है, और विशेष टेम्पलेट पैरामीटर है कि है ऐसा है कि सच है। हालांकि यह चीजों को थोड़ा गन्दा बनाता है क्योंकि तत्काल को अतिरिक्त पैरामीटर निर्दिष्ट करने की आवश्यकता होती है।

आप template<class Foo, bool flag = false> कर सकते हैं, इसलिए दूसरा पैरामीटर वैकल्पिक है।

5

आप एक अलग प्रकार में सभी सामान्य सामान रख सकता है, और विस्तार है कि आपके विशेषज्ञता के साथ:

template <typename> struct S_generic { /* generic stuff here */ }; 

template <typename T> struct S : public S_generic<T> { /* nothing here */ }; 
template <> struct S<Foo> : public S_generic<Foo> { /* extra stuff here */ }; 

संपादित: वैकल्पिक रूप से, अगर आप अतिरिक्त नाम पसंद नहीं है, जिस तरह से उपयोग करने के लिए टेम्पलेट को तत्काल करने के दौरान गड़बड़ी के बिना एक अतिरिक्त ध्वज डिफ़ॉल्ट मान का उपयोग करना है:

template <typename T, bool fully_defined=true> struct S; 
template <typename T> struct S<T,false> { /* generic stuff here */ }; 

template <typename T> struct S<T,true> : public S<T,false> {}; 
template <> struct S<Foo,true> : public S<Foo,false> { /* extra stuff here */ }; 
+0

यही वह है जो मैंने कर दिया। मैं बचने की कोशिश कर रहा था जिसमें दो अलग-अलग नाम हैं। मुझे लगता है कि enable_if और टाइप गुणों का उपयोग करके ऐसा करने का कोई तरीका हो सकता है। – Anycorn

+0

enable_if या टाइप गुणों की सभी अतिरिक्त जटिलताओं को जोड़ने का कोई कारण नहीं है, केवल एक सामान्य आधार का उपयोग करें जो गैर-विशिष्ट और विशेष से प्राप्त हो सकता है। 'BlahBase' या' blah_base' आम हैं। –

+0

इस बिंदु पर जिज्ञासा के मामले में यह इतना व्यावहारिक प्रश्न नहीं है, "मुझे आश्चर्य है कि यह ऐसा कर सकता है?"। – Anycorn

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