2014-07-10 11 views
8

बुनियादी सवाल यहाँ एक पैरामीटर के रूप में एक std :: सरणी लेता है, को परिभाषित करना: मैं एक समारोह जिसका पहला तर्क लिखने के लिए कोशिश कर रहा हूँ एक std :: सरणी है, लेकिन एक मनमाना साथ आकार।एक समारोह है कि (उम्मीद) एक सरल जवाब के साथ

void f(array<int> x) { 
    //do stuff 
} 

मान्य नहीं है, क्योंकि मुझे array<int, #> के लिए आकार की आवश्यकता है। क्या इस से निकाल पाने के लिए कोई तरीका है?

template <size_t N> 
void f(array<int, N> x) { 
    //do stuff 
} 
+0

कृपया इस अनुभाग http://stackoverflow.com/a/ पर विशेष ध्यान दें 4810672/2296458 – CoryKramer

+4

@Cyber ​​नहीं, कि एक नकली नहीं है ... तुम भी जुड़ा हुआ सवाल पढ़ा है और जवाब? लिंक प्रश्न सी शैली सरणी के बारे में है। – Theolodis

+0

आप संकलन समय पर सरणी के आकार को जानते हो? – Scis

उत्तर

12

एक ही रास्ता f बनाने के लिए एक समारोह टेम्पलेट है।

हालांकि, अगर आप रन-टाइम में लचीला होने की जरूरत है मैं बजाय एक std::vector उपयोग करने के लिए आप की सिफारिश करेंगे।

void f(vector<int> x) { 
    //do stuff 
} 

इसके अलावा, आप एक संदर्भ या const संदर्भ का उपयोग करने के सरणी या वेक्टर की नकल से बचने के लिए, कम से कम अगर आप प्रतिलिपि की जरूरत नहीं है चाहते हो सकता है।

12

Quentins answer सही अगर आप रन-टाइम में लचीला होना करने की जरूरत नहीं है:

5

इसके चारों ओर एक दूसरा तरीका, समारोह टेम्पलेट (@Quentin) उपयोग कर रहा है और एक गैर टेम्पलेट समारोह प्रतिनिधि:

#include <array> 

void g(int* first, int* last) { 
    //do stuff 
} 

template <size_t N> 
inline void f(std::array<int, N> x) { 
    g(x.begin(), x.end()); 
} 
+1

और गैर टेम्पलेट फ़ंक्शन का ठोस लाभ क्या है? – Theolodis

+2

@Theolodis: कार्यान्वयन एक स्रोत फ़ाइल में हो सकता है। –

+1

@ थियोलोडिस _'और कंक्रीट लाभ क्या है ...? '_ गैर टेम्पलेट फ़ंक्शन थोड़ा अधिक सामान्य है, और अब' size_t N' प्रदान किए गए संकलन समय पर निर्भर करता है। –

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