shared_ptrएक व्युत्पन्न प्रकार को किसी फ़ंक्शन के shared_ptrआधार पर पास करने के लिए जाने के लिए सबसे अच्छा तरीका क्या है जो एक आधार प्रकार लेता है ?
मैं आमतौर पर shared_ptrएक अनावश्यक प्रतिलिपि से बचने के लिए संदर्भ से गुजरता हूं :
int foo(const shared_ptr<bar>& ptr);
लेकिन यह काम नहीं करता है अगर मैं ऐसा कुछ करने की कोशिश करता हूं
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
मैं प्रयोग कर सकता हूँ
foo(dynamic_pointer_cast<Base, Derived>(bar));
लेकिन यह दो कारणों से उप-इष्टतम लगता है:
- एक
dynamic_castसाधारण व्युत्पन्न-आधार कलाकारों के लिए थोड़ा अधिक लगता है। - जैसा कि मैं इसे समझता हूं,
dynamic_pointer_castफ़ंक्शन को पास करने के लिए पॉइंटर की एक प्रति (एक अस्थायी एक) बनाता है।
क्या कोई बेहतर समाधान है?
पोस्टरिटी के लिए अपडेट:
यह एक लापता हेडर फ़ाइल का एक मुद्दा निकला। इसके अलावा, जो मैं यहां करने की कोशिश कर रहा था, उसे एक एंटीपैटर्न माना जाता है। आम तौर पर,
ऐसे कार्य जो किसी वस्तु के जीवनकाल को प्रभावित नहीं करते हैं (जैसे कि फ़ंक्शन की अवधि के लिए ऑब्जेक्ट वैध रहता है) को एक सादा संदर्भ या सूचक लेना चाहिए, जैसे
int foo(bar& b)।किसी वस्तु का उपभोग करने वाले कार्य (अर्थात किसी दिए गए ऑब्जेक्ट के अंतिम उपयोगकर्ता) को एक
unique_ptrमान लेना चाहिए , जैसेint foo(unique_ptr<bar> b)।std::moveफ़ंक्शन में कॉलर्स का मान होना चाहिए ।ऐसे कार्य जो किसी वस्तु के जीवनकाल का विस्तार करते हैं
shared_ptr, उदाहरण के लिए मान लेना चाहिएint foo(shared_ptr<bar> b)। परिपत्र संदर्भों से बचने की सामान्य सलाह लागू होती है।
विवरण के लिए हर्ब सटर के बैक टू बेसिक्स पर बात करें।
shared_ptr? बार का कोई संदर्भ क्यों नहीं?