टेम्पलेट पर अन्य उपनाम का उपयोग करना

Jan 09 2021

C ++ (दूसरा संस्करण), 2018 की एक पुस्तक A टूर पढ़ना , मैं टेम्प्लेट के बारे में स्पष्टीकरण नहीं समझ पाया (मैं नीचे समझाता हूँ)।

दो समारोह हस्ताक्षर एक के लिए दिया जाता है find_allसमारोह है कि एक रिटर्न vectorका iteratorएक दिया में दिए गए मूल्य की सभी घटनाओं को रों container

# 1:

template<typename C, typename V>
vector<typename C::iterator> find_all(C& c, V v);

# 2:

template<typename T>
using Iterator = typename T::iterator;
template<typename C, typename V>
vector<Iterator<C>> find_all(C& c, V v) ;

दोनों का उपयोग इस तरह किया जा सकता है:

string m {"Mary had a little lamb"};
for (auto p : find_all(m,'a')) // here p is a string::iterator
    cout << *p << endl; // spoiler alert : this will print 'a's

उर्फ टेम्पलेट का उपयोग करते हुए # 2 को कहा जाता है

Iterator के लिए एक अन्य प्रकार का परिचय देकर कार्यान्वयन विवरण छिपाएं

लेखक द्वारा।

हालाँकि मुझे लगता है कि मैं दोनों तरह के उपयोगों को समझता हूँ, मुझे समझ में नहीं आता है कि क्यों # 2 "कार्यान्वयन विवरण छिपाएं" और इसे क्यों पसंद किया जाता है ... क्या आप मुझे समझा सकते हैं?

धन्यवाद !

पोस्टस्क्रिप्टम : मैंने पोस्ट को फ़ंक्शंस की परिभाषा (दोनों हस्ताक्षरों के लिए समान) के साथ प्रदान नहीं किया क्योंकि मुझे लगता है कि यह उपयोगी नहीं है, लेकिन अगर किसी को इसकी ज़रूरत है तो मैं इसे जोड़ दूंगा।

जवाब

6 NathanOliver Jan 09 2021 at 05:54

कहते हैं कि आपके पास एक कोड आधार जैसा है

template<typename C, typename V>
vector<typename C::iterator> first(C& c, V v);
template<typename C, typename V>
vector<typename C::iterator> second(C& c, V v);
template<typename C, typename V>
vector<typename C::iterator> third(C& c, V v);
template<typename C, typename V>
vector<typename C::iterator> fourth(C& c, V v);
...

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

template<typename T>
using Iterator = typename T::iterator;
template<typename C, typename V>
vector<Iterator<C>>  first(C& c, V v);
template<typename C, typename V>
vector<Iterator<C>>  second(C& c, V v);
template<typename C, typename V>
vector<Iterator<C>>  third(C& c, V v);
template<typename C, typename V>
vector<Iterator<C>>  fourth(C& c, V v);

आपको बस इतना करना होगा कि परिवर्तन हो

template<typename T>
using Iterator = typename T::iterator;

सेवा मेरे

template<typename T>
using Iterator = typename T::const_iterator;

और आपने कल लिया। यह है कि यह "कार्यान्वयन के विवरण को कैसे छुपाता है"।