2012-01-12 32 views
8

प्रश्न बिना किसी उदाहरण के समझ में आता है। तो यह है कि मैं क्या करने की कोशिश कर रहा हूँ।सी ++ 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 {}; 

मुझे लगता है कि फू टेम्पलेट एक उपयोगी चीज है।

+2

'फू' टेम्पलेट 'टेम्पलेट <टाइपनाम टी, टी>' कहने जैसा होगा, आखिरी टेम्पलेट पैरामीटर वास्तव में कुछ भी नहीं जोड़ता है और इसलिए पूरी तरह से अनैतिक है, इसके बाद टाइप को केवल ठीक से व्यक्त किया जा सकता है टेम्पलेट पैरामीटर (उदाहरण के लिए 'टाइपेडफ रेट (* func) (Args ...) '' Foo' के अंदर) – Grizzly

+2

@Grizzly: अंतिम पैरामीटर * प्रकार * प्रदान नहीं कर रहा है (जिसे टाइपिफ़ द्वारा प्रतिस्थापित किया जा सकता है), यह प्रदान कर रहा है एक समारोह सूचक। एक फ़ंक्शन पॉइंटर जिसे संकलन-समय पर प्रतिस्थापित किया जाता है, इस प्रकार इन-लाइनिंग जैसे पार-प्रक्रियात्मक अनुकूलन को सक्षम बनाता है। –

+0

@ सुमंत: आप सही हैं कि यह अस्पष्ट लगता है, हालांकि मुझे लगता है कि मानक केवल सरलता के लिए सरलता का लक्ष्य है कि यह निर्धारित करके कि एक पैरामीटर पैक अंतिम संभव "पैरामीटर" था और बाद में कुछ भी नहीं आ सकता था। यह मिलान आसान बनाता है। –

उत्तर

8

(अतिरिक्त:। सीधे अपने पहले सवाल का जवाब है, तो आप भी एक टेम्पलेट के अंदर एक टेम्पलेट में template<class...T, T... t> void func() {} बदल सकते हैं यह छ ++ 4.6 में काम नहीं करता है, लेकिन बजना 3.0 में करता है, इसलिए यह ले लिया मुझे थोड़ी देर के लिए यह पता लगाने के लिए)

एक टेम्पलेट के अंदर एक टेम्पलेट रखो:।

template<class ... T> 
struct func_types { 
    template <T ... t> 
    static void func_values() { 
     // This next line is just a demonstration, and 
     // would need to be changed for other types: 
     printf("%c %d\n", t...); 
    } 
}; 

int main() { 
    func_types<char, int> :: func_values<'A', 10>(); 
} 

एक टेम्पलेट के अंदर एक टेम्पलेट स्वीकार्य है? एक विकल्प है के साथ tuples का उपयोग करना। । मुझे लगता है कि यह संभव है, लेकिन आप अपने खुद के टपल वर्ग रोल करना पड़ सकता है (ऐसा लगता है कि make_tuple एक constexpr नहीं है

अंत में, आप अपने फू टेम्पलेट लागू करने में सक्षम इस प्रकार हो सकती है:

template<typename Ret, typename ...Args> 
struct Foo { 
     template< Ret (*func)(Args...)> 
     struct Bar { 
       template<typename T...> 
       Bar(T&&... args) { 
         cout << "executing the function gives: " 
          << func(std::forward(args)...) << endl; 
       } 
     }; 
}; 

int main() { 
    Foo<size_t, const char*> :: Bar<strlen> test1("hi"); 
    Foo<int, const char*, const char*> :: Bar<strcmp> test2("compare","these"); 
} 

यह बाद कोड ideone पर है। प्रदर्शित करने के लिए, मैं समारोह कोड टेम्पलेट में है कि करने के लिए आर्ग अग्रेषित करने के लिए एक निर्माता को लागू किया।

+1

ध्यान दें कि 'Args && ...' का उपयोग करना बुरा है, क्योंकि पूर्ण अग्रेषण टेम्पलेट तर्क कटौती द्वारा संचालित है। हालांकि आप स्पष्ट रूप से तर्क प्रकार निर्दिष्ट करते हैं, क्योंकि यह अनावश्यक है। – Xeo

+0

आह हाँ, @ एक्सईओ। मुझे 'func (args ...) '' func (std :: forward (args ... के साथ' प्रतिस्थापित करना चाहिए) 'अन्यथा जैसे ही राजस्व उनकी रैल्यू-नेस खो देता है (माना जाता है कि हमारे' func' ने रावल लिया है)? मेरे लिए उसका मतलब बनता है। क्या कोई अन्य सूक्ष्मता है जो मुझे याद आ रही है? –

+0

.. ओह, असल में, मुझे लगता है कि मुझे कन्स्ट्रक्टर को स्वयं टेम्पलेट बनाने की भी आवश्यकता है, ताकि यह कटौती सामग्री हो। –

2

क्योंकि कोई नहीं सोचा गया है यह इस सुविधा के लिए लायक हो जाएगा। variadic के डिजाइन टेम्पलेट का उद्देश्य सरल और काम करना था। अन्य संभावित उन्नत और उपयोगी fe आंतों में भी शामिल थे।

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