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>::type
std::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 कुछ हिस्सों में पतन हो जाएगा।
हां, ऐसा करने का यह तरीका है। या आप कुछ और पूछ रहे हैं? – jrok
आपके साथ क्या गलत है? – Asaf
इस प्रश्न का उत्तर स्वयं पर्याप्त है। बस यह जोड़ने के लिए कि अगर कोई ऐसे वैक्टरों को फिर से चालू करना चाहता है तो इसका उपयोग करें: 'के लिए (टाइपनाम वेक्टर :: const_iterator it = vect.begin(); it! = Vect.end(); ++ it) ' –