2012-11-06 17 views
7

मुझे नहीं पता कि मेरे पास क्या है एक कंपाइलर बग है या अगर मैं बस जो करने की कोशिश कर रहा हूं उसके लिए सिंटैक्स नहीं जानता।विविधता टेम्पलेट सरणी संदर्भ पैरामीटर के लिए वाक्यविन्यास क्या है?

takeArrays("foo", "bar"); 

क्यों मैं ऐसा करना चाहते हैं:

void takeArrays(const char (&str1)[4], const char (&str2)[4]) { 
} 

यह ठीक संकलित जब साथ कहा जाता है: एक समारोह है कि 2 सरणी संदर्भ लेता है कल्पना कीजिए? चूंकि const char* गुजरने से स्ट्रिंग अक्षर की आकार जानकारी खो जाती है, और यह कि मैं जो कर रहा हूं उसके लिए यह महत्वपूर्ण है।

मैं वास्तव में क्या करना चाहता हूं, हालांकि, सरणी संदर्भों की एक विविध संख्या पास कर रहा है। यह वह जगह है जहां चीजें थोड़ा बदसूरत हो जाती हैं (यह बदतर हो जाती है)। मैं भोलेपन इस की कोशिश की:

template<typename... Args> 
void takeArrays(const char (&Args... strs)[4]) { 
} 

और मिल गया "error: variable or field ‘takeArrays’ declared void" और "error: expected primary-expression before ‘const’" (जीसीसी 4.6)।

template<typename... Args> 
void takeArrays(const char (&(Args... strs))[4]) { 
} 

और "no matching function for call to ‘takeArrays(const char [4], const char [4])’" और "candidate is template<class ... Args> void takeArrays(const char (& (*)(Args ...))[4])" मिला: तो मैं इस कोशिश की। जो अपठनीय है लेकिन मैं जो चाहता हूं उसके करीब दिखता है। मैंने कई बदलावों की कोशिश की है और इसे संकलित करने के लिए प्रतीत नहीं होता है। ,

takeArrays("foo", "foobar", "longerstring"); 

और विभिन्न आकारों की सरणियों के एक variadic सूची प्राप्त यानी कॉल ऊपर से विस्तार किया जाना चाहिए:

वहाँ ऊपर लिखने के लिए एक उचित तरीके से, क्या मैं वास्तव में क्या करना चाहते हैं है मान लिया जाये कि कॉल है संकलक करने के लिए:

void takeArrays(const char (&str1)[4], const char (&str2)[7], 
       const char (&str3)[13]); 

कौन सा पहले लगता है कि मैं क्या कर रही कोशिश की था, और मेरे प्रयास की तरह कुछ था:

template<size_t... Sizes> 
void takeArrays(const char (&strs)[Sizes]...); 

मुझे जो कुछ भी मिला वह त्रुटि संदेश था। मुझे पता है कि मैं जो करने की कोशिश कर रहा हूं वह थोड़ा पागल है लेकिन मैं वास्तव में जानना चाहता हूं कि यह संभव है, और यदि हां, तो उचित वाक्यविन्यास क्या है। अग्रिम में धन्यवाद।

उत्तर

9

एक ही तत्व प्रकार के variadic सरणियों के लिए वाक्य रचना है:

template<size_t... Sizes> 
void takeArrays(const char (&...args)[Sizes]); 

यह सामान्य variadic स्थिरांक संदर्भ सिंटैक्स के समान है:

template<typename... Args> 
void takeArrays(const Args &...args); 

एक आसान तरीका है याद रखना होगा कि अंडाकार है पैरामीटर नाम से पहले तुरंत चला जाता है।

+0

हाँ, यह काम किया। धन्यवाद! पैरामीटर नाम चाल से पहले मुझे इलिप्सिस याद आएगा। जिज्ञासा से, मैं एक ही आकार के मूल पैरामीटर कैसे लिखूं? मैंने 'टेम्पलेट <टाइपनाम ... Args> शून्य ले लिया Arrays (cont char Args (& ... args ([4])' और 'const char (Args & ... args) [4] 'और उन नहीं काम –

+5

@ एलीटाइव्स को उसी कारण से काम करने के लिए नहीं बनाया जा सकता है कि आप एक 'विविध' int टेम्पलेट नहीं ले सकते हैं, 'टेम्पलेट शून्य foo (int ... i/* काम नहीं करता है: यहां विस्तार करने के लिए कोई पैक नहीं है * /); 'सामान्य वर्कअराउंड एक ही आकार के सरणी को विभिन्न तत्व प्रकार, यानी' टेम्पलेट शून्य foo (टी (& ... args) [आकार]); '। फिर आप वैकल्पिक रूप से 'static_assert' को लागू कर सकते हैं ताकि सभी' टी '' const char' हो। –

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