मैं अपने collection<T>
इंटरफ़ेस के लिए map
सदस्य फ़ंक्शन कैसे जोड़ सकता हूं?
संक्षिप्त उत्तर है: आप नहीं करते हैं। अगर मेरे पास collection<int>
है और मैं map
std::to_string
पर चाहता हूं, तो मुझे collection<std::string>
का उत्पादन करना होगा। लेकिन vector_collection<int>
को vector_collection<std::string>
और list_collection<int>
को list_collection<std::string>
बनाने की आवश्यकता है - ताकि परिवर्तन प्रकार को virtual
ized होना चाहिए। लेकिन आपके पास virtual
सदस्य फ़ंक्शन टेम्पलेट्स नहीं हो सकते हैं, इसलिए इसे व्यक्त करने का कोई तरीका नहीं है।
इस काम के लिए, आपको अपने कंटेनर में रखे गए सभी ऑब्जेक्ट्स के लिए एक सामान्य आधार प्रकार होना चाहिए और फिर केवल एक सामान्य मुखौटा होना चाहिए जिसे आप बीच में डाल सकते हैं। यही है, आप वास्तव में केवल collection<unique_ptr<Object>>
है जहां map
आपको एक अलग collection<unique_ptr<Object>>
देता है, और आप map
अपने collection_facade<int, collection<unique_ptr<Object>>>
को collection_facade<std::string, collection<unique_ptr<Object>>>
में डालते हैं। प्रदर्शन और प्रकार की सुरक्षा के लिए बहुत सारे काम और पूरी तरह से उपेक्षा के साथ, आप वहां जा सकते हैं।
यह टेम्पलेट का लाभ है। अगर मैं vector
की तरह कुछ के लिए map
लिखना चाहते हैं, मैं सिर्फ इतना है कि लिख सकते हैं:
template <class T, class A, class F, class R = std::result_of_t<F(T)>>
std::vector<R, A> map(std::vector<T, A> const& v, F f) {
std::vector<R, A> mapped;
mapped.reserve(v.size());
for (T const& elem : v) {
mapped.push_back(f(elem));
}
return mapped;
}
या:
template <class T, class A, class F, class R = std::result_of_t<F(T)>>
std::vector<R, A> map(std::vector<T, A> const& v, F f) {
return std::vector<R, A>(
boost::make_transform_iterator(v.begin(), f),
boost::make_transform_iterator(v.end(), f)
);
}
मैं प्रत्येक कंटेनर के लिए map()
अलग से लागू करने के लिए है - लेकिन मैं ऐसा करने के लिए होगा वैसे भी। और अब मैं कुछ भी नहीं दे रहा हूँ। इसके अलावा, आप कितनी बार एल्गोरिदम लिख रहे हैं जो रनटाइम-कंटेनर-अज्ञेयवादी हैं?
सी ++ मानक कंटेनर के साथ क्या गलत है? –
@ πάντα ῥεῖ ओपी मुझे लगता है कि सीखने के उद्देश्यों के लिए ऐसा करने की कोशिश कर रहा है। –
कुछ भी नहीं, मैं सिर्फ यह जानना चाहता हूं कि शिक्षित उद्देश्य – Exagon