2013-12-09 10 views
6

कुछ समय मैं की तरह दो टेम्प्लेट लिखना चाहते हैं:क्यों सी ++ टेम्पलेट ओवरलोडिंग की अनुमति नहीं देता है?

template <typename Type1> 
class A{ 
    ... 
}; 

template <typename Type1, typename Type2> 
class A{ 
    ... 
}; 

लेकिन ऐसा लगता है कि यह दो टेम्पलेट्स एक ही नाम साझा लेकिन अलग-अलग पैरामीटर के लिए गैर कानूनी है। मुझे इसे A_1, A_2 नाम देना होगा। मुझे लगता है कि यह उपयोगी हो सकता है अगर मैं इसे विशेष रूप से फंक्शंस को लागू करते समय कर सकता हूं।

क्यों सी ++ इसकी अनुमति नहीं देता है? क्या कुछ परिस्थितियों में इसे लागू करना या अस्पष्टता करना मुश्किल है? क्या यह सी ++ के बाद के संस्करण पर समर्थित होगा?

+7

इसी कारण से सी ++ एक ही नाम के साथ दो वर्गों की अनुमति नहीं देता है। – Jack

+2

सी ++ 11 वैरैडिक टेम्पलेट्स का उपयोग करें http://en.wikipedia.org/wiki/Variadic_template – higuaro

+0

आप शायद इसे डिफ़ॉल्ट टेम्पलेट तर्कों के साथ अनुमानित कर सकते हैं। –

उत्तर

12

यह बेहद उपयोगी है, लेकिन जैसा कि आप कहते हैं, सी ++ आपको सीधे ऐसा करने की अनुमति नहीं देता है। हालांकि, आप आंशिक विशेषज्ञता के साथ लगभग एक ही चीज़ कर सकते हैं।

यह विशेष रूप से आसान है अगर तुम सी ++ 11 में variadic टेम्पलेट्स उपयोग करते हैं, के रूप में आप निम्न कर सकते है:

template <typename... T> 
struct A; // Declared but not defined 

template <typename T, typename U> 
struct A<T, U> 
{ 
    // definition of the two-parameter case 
}; 

template <typename T> 
struct A<T> 
{ 
    // definition of the one-parameter case 
}; 

प्रभावी रूप से, यह आप A<T, U> और A<T> के रूप में पूरी तरह से अलग प्रकार की अनुमति देता है। अधिक टेम्पलेट पैरामीटर के साथ A को तत्काल करने का प्रयास करने से संकलन त्रुटि हो जाएगी क्योंकि सामान्य मामला अपरिभाषित है (यदि आप चाहें तो एक अच्छा त्रुटि संदेश देने के लिए आप static_assert का उपयोग कर सकते हैं)।

डिफ़ॉल्ट टेम्पलेट पैरामीटर (एक खाली डमी संरचना, या void पर सेट) का उपयोग कर सी ++ 03 में कुछ समान हासिल किया जा सकता है, लेकिन सी ++ 11 संस्करण बहुत अच्छा आईएमओ है।

0

एक साधारण (संभव) समाधान, दूसरे टेम्पलेट तर्क के लिए डिफ़ॉल्ट मान होगा। इस तरह आप केवल एक टेम्पलेट को लागू करते हैं, और आप इसे एक टेम्पलेट तर्क के साथ कॉल कर सकते हैं, और डिफ़ॉल्ट सेकेंड का उपयोग कर सकते हैं, या डिफ़ॉल्ट को ओवरराइड कर सकते हैं।

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

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