2013-09-30 12 views
12

के रूप में वे एक क्लास विधि बनाना चाहते हैं जो std :: vector संदर्भ को तर्क के रूप में ले ले। मैं इसे विभिन्न प्रकार के डेटा के साथ उपयोग करना चाहता हूं।std :: वेक्टर टेम्पलेट फ़ंक्शन तर्क

तो मैं समारोह की तरह बनाना चाहते:

void some_function(const std::vector & vect){ //do something with vector } 

और मैं उदाहरण के लिए के साथ उपयोग करना चाहते हैं:

std::vector<int> v1; 
some_function(v1); 
std::vector<string> v2; 
some_function(v2); 

मुझे आशा है कि मैं अपनी बात स्पष्ट कर दिया।

template<class T> 
void some_function(std::vector<T> & vect){} 

या मैं अन्य तरीके से यह कर सकते हैं: मैं उस तरह टेम्पलेट विधि बनाने के लिए है? अगर मुझे यह कहना है, तो मुझे बताएं कि मैं उस विधि को कक्षा

सहायता के लिए धन्यवाद कैसे लिख सकता हूं!

+0

हां, ऐसा करने का यह तरीका है। या आप कुछ और पूछ रहे हैं? – jrok

+2

आपके साथ क्या गलत है? – Asaf

+0

इस प्रश्न का उत्तर स्वयं पर्याप्त है। बस यह जोड़ने के लिए कि अगर कोई ऐसे वैक्टरों को फिर से चालू करना चाहता है तो इसका उपयोग करें: 'के लिए (टाइपनाम वेक्टर :: const_iterator it = vect.begin(); it! = Vect.end(); ++ it) ' –

उत्तर

22

const& द्वारा किसी भी std::vector स्वीकार करने के लिए एक template समारोह के लिए सही तरीका है:

template<typename T, typename A> 
void some_func(std::vector<T,A> const& vec) { 
} 

दूसरा तर्क "संभाजक" है, और std::vector के कुछ उन्नत उपयोग में यह डिफ़ॉल्ट रूप से एक नहीं होगा। यदि आप केवल std::vector<T> स्वीकार करते हैं, तो आपके some_func वैकल्पिक आवंटकों के साथ std::vector एस को अस्वीकार कर देगा।

अब, इस दृष्टिकोण के अन्य तरीके हैं जिन्हें मैं जल्दी से सूचीबद्ध करूंगा। मैं उन्हें कम लागत में सूचीबद्ध करूंगा: लाभ अनुपात - उपर्युक्त एक जो संभवतः आप चाहते हैं, और अगला वाला कभी-कभी उपयोगी होता है, और उसके बाद मैं इंजीनियर किए गए मामलों में बंद हो जाता हूं जो शायद ही कभी विचार करने योग्य हैं (लेकिन उपयोगी हो सकता है कुछ कोने मामलों में)।

आप T&& तो परीक्षण के द्वारा एक मनमाना प्रकार T स्वीकार करता है, तो typename std::remove_reference<T>::typestd::vector की तरह है निर्धारित करने के लिए कर सकता है। यह आपको आने वाले std::vector के "पूर्ण अग्रेषण" करने की अनुमति देगा। यह आपको केवल std::vector से अधिक स्वीकार करने के लिए परीक्षण करने के लिए उपयोग की जाने वाली भविष्यवाणी को बदलने देगा: अधिकांश भाग के लिए, const& से std::vector शायद कुछ मनमाने ढंग से यादृच्छिक-पहुंच कंटेनर की आवश्यकता है।

एक हास्यास्पद रूप से फैंसी तरीका दो-चरणीय कार्य करना होगा। दूसरा चरण एक टाइप-मिस्ड यादृच्छिक-पहुंच रेंज व्यू (या केवल एक रेंज-व्यू लेता है यदि आपको यादृच्छिक पहुंच की आवश्यकता नहीं है) एक निश्चित प्रकार T के लिए SFINAE के साथ यह सुनिश्चित करने के लिए कि आने वाली ऑब्जेक्ट संगत है, पहला चरण deduces पास किए गए प्रकार के कंटेनर प्रकार और एक SFINAE संदर्भ में दूसरे चरण को कॉल करें (auto some_func(...)->decltype(...))।

T रों की एक यादृच्छिक अभिगम रेंज देखने के लिए std::vector<T> const& के प्रकार विलोपन जितना कार्यक्षमता खो नहीं करता है, एक फायदा होगा आप की गारंटी दे सकें कि std::vector<T> const& के लिए और T[n] और के लिए है कि अपने समारोह के शरीर बिल्कुल वैसा ही है std::array<T,n> के लिए।

यह एक बड़ा फायदा नहीं है, खासकर बॉयलरप्लेट के लिए आवश्यक है।

सी ++ 1y यह अधिक आसान बना सकता है, क्योंकि ऊपर दिए गए बहु-चरण SFINAE कुछ हिस्सों में पतन हो जाएगा।

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