2012-08-10 26 views
12

मैं थोड़ा उलझन में हूं क्योंकि डिफ़ॉल्ट पैरामीटर टेम्पलेट और एक वैरिएडिक टेम्पलेट पैरामीटर दोनों टेम्पलेट का अंतिम पैरामीटर होना चाहिए। तो मेरे समारोह के लिए अच्छा आधिकारिक वाक्यविन्यास क्या है?डिफ़ॉल्ट पैरामीटर टेम्पलेट बनाम विविध टेम्पलेट: अंतिम टेम्पलेट पैरामीटर क्या है?

template<typename T, class T2 = double, unsigned int... TDIM> myFunction(/* SOMETHING */) 

या

template<typename T, unsigned int... TDIM, class T2 = double> myFunction(/* SOMETHING */) 

उत्तर

17

वास्तव में, टेम्पलेट पैरामीटर पैक और डिफ़ॉल्ट पैरामीटर , एक समारोह में पिछले होने की नहीं है, तो कुछ भी करने के बाद यह निष्कर्ष निकाला हो जाएगा आता है कि (या चूक है):

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...>>{}; 
संबंधित मुद्दे