आपका सुझाव (shared_ptr<T>
कोई तर्क के साथ कन्स्ट्रक्टर को कॉल करना) सही है। (मान 0 के साथ कन्स्ट्रक्टर को कॉल करना बराबर है।) मुझे नहीं लगता कि यह vec.push_back()
को पूर्व-मौजूदा shared_ptr<T>
के साथ कॉल करने से धीमा होगा, क्योंकि दोनों मामलों में निर्माण की आवश्यकता है (या तो प्रत्यक्ष निर्माण या प्रति-निर्माण)।
लेकिन अगर आप चाहते हैं "अच्छे" वाक्य रचना, आप निम्न कोड की कोशिश कर सकते:
class {
public:
template<typename T>
operator shared_ptr<T>() { return shared_ptr<T>(); }
} nullPtr;
यह एक एकल वैश्विक वस्तु nullPtr
है, जो निम्नलिखित प्राकृतिक वाक्य रचना के लिए सक्षम बनाता वाणी:
shared_ptr<int> pi(new int(42));
shared_ptr<SomeArbitraryType> psat(new SomeArbitraryType("foonly"));
...
pi = nullPtr;
psat = nullPtr;
नोट कि यदि आप इसे एकाधिक अनुवाद इकाइयों (स्रोत फ़ाइलों) में उपयोग करते हैं, तो आपको कक्षा को एक नाम देना होगा (उदाहरण के लिए _shared_null_ptr_type
), nullPtr
ऑब्जेक्ट की परिभाषा को एक अलग .cpp फ़ाइल में ले जाएं, और extern
टी में घोषणाएं जोड़ें वह हेडर फ़ाइल जहां वर्ग परिभाषित किया गया है।
स्रोत
2009-03-07 04:31:33
अच्छी खबर यह है: वहाँ, आप लिख सकते हैं "vec.emplace_back();" और एक शून्य सूचक संलग्न करें :) –
'boost :: ptr_vector' का उपयोग करने पर विचार करें जिसके लिए कम ओवरहेड की आवश्यकता है। – Philipp