2014-10-09 18 views
17

मान लीजिए हम एक वर्गकार्य

template <int(*F)(int, int)> 
class A { 
    // ... 
}; 

यह एक टेम्पलेट तर्क के रूप में एक समारोह लेता है।

अब मैं एक वैरिएड टेम्पलेट बनाना चाहता हूं, जो टेम्पलेट पैरामीटर के रूप में कार्य करता है।

template <int(*F...)(int, int)> // this won't compile 
template <int(*F)(int, int)...> // this won't compile either 

इसे ठीक से कैसे करें?

+1

तो आपको किस संकलन त्रुटियां मिलीं? – Useless

+2

इस मामले में 'एफ'' नाम हमेशा "बस से पहले" है। – leemes

उत्तर

12
template <int(*...F)(int, int)> 
class A { 
    // ... 
}; 
18

आप

using Function_t = int(*)(int, int); 

template <Function_t ... Fs> struct s{}; 

किसी और से कर सकते हैं, तो आप typedef

template <int(*...Fs)(int, int)> struct s{}; 

नोट का उपयोग नहीं करना चाहते हैं: दूसरे संस्करण गुमनाम नहीं किया जा सकता (Fs आवश्यकता होती है) के रूप में आईएसओ सी ++ 11 को नाम रखने के लिए एक कोष्ठक पैक घोषणा की आवश्यकता होती है।

3

बस टेम्पलेट तर्क के रूप में एफ का उपयोग करें। यह न केवल आपको पैरामीटर के रूप में फ़ंक्शन का उपयोग करने की अनुमति देता है बल्कि अन्य प्रकार जो ब्रांड्स ऑपरेटर लागू करता है। इन कक्षाओं को फ़ैक्टर कहा जाता है।

+4

एक बुद्धिमान सुझाव हो सकता है लेकिन समस्या का हल नहीं है। यह भी ध्यान रखें कि यहां, फ़ंक्शंस स्वयं टेम्पलेट पैरामीटर हैं, न केवल उनके प्रकार। आपके मामले में, फ़ैक्टर के प्रकार टेम्पलेट पैरामीटर होंगे, लेकिन (जहां उनका उपयोग किया जाता है, इस पर निर्भर करता है) आपको उन्हें फ़ंक्शन तर्क के रूप में पास करने की आवश्यकता होती है। – leemes

2

फ़ंक्शन पॉइंटर प्रकार वाक्यविन्यास परेशान है। तो इसके चारों ओर कोड:

template<class T> using type=T; 

template< type<int(int,int)>* ... Fs > 
class A { 
}; 
+0

हालांकि दिलचस्प है, उन प्रकार के कार्यों के लिए विभिन्न वाक्यविन्यासों का उपयोग अजीब IMHO दिखता है। शायद 'सूचक '? – dyp

+0

@dyp मैं चीजों को "सामान्य" चर जैसे बाएं से दाएं पढ़ना चाहता हूं, और 'पॉइंटर ' ऐसा नहीं करता है। – Yakk

+0

ठीक है आप इस तरह के सामान्य चर घोषित करना शुरू कर सकते हैं: 'सूचक x; सरणी एफ; संदर्भ <सरणी <10, सूचक <स्थिर >>> एस; ';) - हम्म नाम टाइप ऑपरेटर? – dyp

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