प्रश्न बिना किसी उदाहरण के समझ में आता है। तो यह है कि मैं क्या करने की कोशिश कर रहा हूँ।सी ++ 11 में टाइप पैरामीटर पैक के बाद अस्वीकृत एक अभिन्न मूल्य पैरामीटर पैक का उपयोग क्यों कर रहा है?
template<class T, class U, T t, U u>
void func() {}
func<char, int, 'A', 10>();
लेकिन यह अपनी प्राकृतिक variadic एक्सटेंशन की तरह काम नहीं करता है लगता है:
सामान्य सी ++ में निम्नलिखित अनुमति देता है।
template<class...T, T... t>
void func() {}
func<char, int, 'A', 10>();
दोनों क्लैंग और जी ++ 4.7 उपर्युक्त कोड को अस्वीकार करते हैं। त्रुटि दिखायी जाती है कि तत्कालता कब की जाती है। यह मुझे प्रतीत होता है कि दो परिवर्तनीय सूचियों को अनजाने में पार्स किया जाना चाहिए क्योंकि पहले व्यक्ति के प्रकार होते हैं और दूसरे के पास केवल अभिन्न मूल्य होते हैं।
यदि उपरोक्त काम करने के लिए नहीं है, तो मुझे लगता है कि निम्नलिखित काम नहीं करेंगे।
template <class Ret, class... Args, Ret (*func)(Args...)>
class Foo {};
मुझे लगता है कि फू टेम्पलेट एक उपयोगी चीज है।
'फू' टेम्पलेट 'टेम्पलेट <टाइपनाम टी, टी>' कहने जैसा होगा, आखिरी टेम्पलेट पैरामीटर वास्तव में कुछ भी नहीं जोड़ता है और इसलिए पूरी तरह से अनैतिक है, इसके बाद टाइप को केवल ठीक से व्यक्त किया जा सकता है टेम्पलेट पैरामीटर (उदाहरण के लिए 'टाइपेडफ रेट (* func) (Args ...) '' Foo' के अंदर) – Grizzly
@Grizzly: अंतिम पैरामीटर * प्रकार * प्रदान नहीं कर रहा है (जिसे टाइपिफ़ द्वारा प्रतिस्थापित किया जा सकता है), यह प्रदान कर रहा है एक समारोह सूचक। एक फ़ंक्शन पॉइंटर जिसे संकलन-समय पर प्रतिस्थापित किया जाता है, इस प्रकार इन-लाइनिंग जैसे पार-प्रक्रियात्मक अनुकूलन को सक्षम बनाता है। –
@ सुमंत: आप सही हैं कि यह अस्पष्ट लगता है, हालांकि मुझे लगता है कि मानक केवल सरलता के लिए सरलता का लक्ष्य है कि यह निर्धारित करके कि एक पैरामीटर पैक अंतिम संभव "पैरामीटर" था और बाद में कुछ भी नहीं आ सकता था। यह मिलान आसान बनाता है। –