वास्तव में, टेम्पलेट पैरामीटर पैक और डिफ़ॉल्ट पैरामीटर , एक समारोह में पिछले होने की नहीं है, तो कुछ भी करने के बाद यह निष्कर्ष निकाला हो जाएगा आता है कि (या चूक है):
template<class T, class... Args, class T2 = int, class T3>
void f(T3){}
ध्यान दें कि आप T2
के लिए कुछ भी निर्दिष्ट नहीं कर सकते हैं, के बाद से सब कुछ variadic पैक के द्वारा निगल लिया हो जाएगा । उस से निष्कर्ष निकालने पर, मैं कहूंगा कि डिफ़ॉल्ट मानकों के बाद वेरिएड पैक डालने का अर्थ है, अगर उन्हें मैन्युअल रूप से निर्दिष्ट किया जाना है। समर्पित पैक के लिए, यह एक स्टाइलिस्ट पसंद है, और मैं व्यक्तिगत रूप से उन्हें अंतिम रखूंगा।
ध्यान दें कि यदि उन्हें किसी अन्य टेम्प्लेट के हिस्से के रूप निष्कर्ष निकाला रहे हैं, आप यहां तक कि कई variadic पैक हो सकता है:
template<class...> struct pack{};
template<class T, class... P1, class... P2, class T2>
void f(pack<P1...>, pack<P2...>, T2){}
इस तरह के मामलों में, मैं करने के लिए पैक और अन्य टेम्प्लेट पैरामीटर रिश्तेदार डाल चाहते हैं उनके फ़ंक्शन पैरामीटर, यानी एक ही क्रम में।
(प्राथमिक) वर्ग टेम्पलेट्स के लिए, यह बिल्कुल अलग है, क्योंकि कोई अनुमानित तर्क नहीं हो सकते हैं। वास्तव में, variadic पैक है टेम्पलेट पैरामीटर सूची के अंत में होने की:
template<class T, class... Args, class T2=int>
struct X{}; // error
आंशिक विशेषज्ञताओं के लिए, क्रम में कोई फर्क नहीं पड़ता और यह एक विशुद्ध रूप से शैलीगत चुनाव फिर से है। मैं व्यक्तिगत रूप से उन्हें पहले जैसे प्राथमिक टेम्पलेट के पैरामीटर से संबंधित रखूंगा।
template<class T1, class T2>
struct X{};
template<template<class...> class T1, class... A1,
template<class...> class T2, class... A2>
struct X<T1<A1...>, T2<A2...>>{};