निरंतर my journey into the world of variadic templates, मुझे एक और समस्या का सामना करना पड़ा। ,एकाधिक टेम्पलेट पैरामीटर पैक के साथ आंशिक टेम्पलेट विशेषज्ञता
template < template < typename ... > class T, typename ...Args >
struct foo< T<Args...> >
{
//specialized implementation
};
इस के साथ
foo<int>
डिफ़ॉल्ट कार्यान्वयन और foo< std::tuple< int, char > >
के अनुरूप होगा:
template < typename T >
struct foo
{
//default implementation
};
यह आंशिक रूप से इस तरह variadic टेम्पलेट instantiations के लिए यह विशेषज्ञ के लिए संभव है:
निम्नलिखित टेम्पलेट वर्ग मानते हुए विशेष कार्यान्वयन के लिए।
हालांकि, कई टेम्पलेट पैरामीटर का उपयोग करते समय चीजें अधिक जटिल हो जाती हैं। उदाहरण के लिए, अगर हम निम्न टेम्पलेट वर्ग
template < typename T, typename U >
struct bar {};
है और हम आंशिक रूप से यह विशेषज्ञ के रूप में हम foo
के लिए किया था चाहते हैं, हम
template < template < typename ... > class T, typename ...TArgs,
template < typename ... > class U, typename ...UArgs >
struct bar< T<TArgs...>, U<UArgs...> > {};
//This would correspond to the specialized version with
//T=std::tuple,
//TArgs=int,char
//U=std::tuple,
//UArgs=float
bar< std::tuple< int, char >, std::tuple<float> > b;
दरअसल ऐसा नहीं कर सकते, अगर मैं सही हूँ, हम केवल कर सकते हैं एक टेम्पलेट पैरामीटर पैक है और इसे पैरामीटर सूची के अंत में स्थित होना चाहिए। मैं समझता हूं कि यह टेम्पलेट घोषणाओं में क्यों अनिवार्य है, लेकिन कुछ आंशिक टेम्पलेट विशेषज्ञता (उपरोक्त उदाहरण की तरह) के लिए, यह कोई मुद्दा नहीं होना चाहिए।
क्या एकाधिक टेम्पलेट पैरामीटर पैक के साथ आंशिक टेम्पलेट विशेषज्ञता प्राप्त करना संभव है?
संपादित: अब मैं मूर्ख महसूस ... कोड मैं ऊपर दे दी है (कम से कम जीसीसी 4.5 के साथ) पूरी तरह से संकलित करता है। मेरे पास संकलित त्रुटि एकाधिक पैरामीटर पैक की वजह से नहीं थी, लेकिन सदस्य फ़ंक्शन पैरामीटर के रूप में उनके उपयोग के कारण। bar
का आंशिक विशेषज्ञता में, मैं एक सदस्य समारोह है कि दोनों TArgs
और UArgs
पैरामीटर लेता है परिभाषित करने की कोशिश की:
template < template < typename ... > class T, typename ...TArgs,
template < typename ... > class U, typename ...UArgs >
struct bar< T<TArgs...>, U<UArgs...> >
{
void method(TArgs... targs, UArgs... uargs) //compile error here
{
}
};
सदस्य समारोह घोषणा पर, जीसीसी मुझे त्रुटि
देतामापदंडों पैक किया जाना चाहिए पैरामीटर सूची के अंत में।
जहां तक मैं कह सकता हूं, संकलक किसी दिए गए टेम्पलेट तत्काल के लिए सही सदस्य फ़ंक्शन को परिभाषित करने में सक्षम होना चाहिए, उदा। bar< std::tuple< int, char >, std::tuple<float> >
में सदस्य फ़ंक्शन void method(int, char, float)
होना चाहिए। क्या मुझसे कुछ गलत हो रही है? या क्या मैं ऐसा कुछ करने की कोशिश कर रहा हूं जो संभव नहीं है? यदि हां, तो क्या कोई अच्छा कारण नहीं है कि यह संभव नहीं है?
नीट, मुझे नहीं पता था कि आप टेम्पलेट सूची के तत्वों को टेम्पलेट्स के रूप में विशेषज्ञ/निर्दिष्ट (निर्दिष्ट) कर सकते हैं। – JAB