2013-02-14 19 views
6

unique_ptr<char[]> को unique_ptr<const char[]> पर स्थानांतरित करने के लिए सबसे अच्छा मुहावरे क्या है?अद्वितीय_ptr <char[]> से unique_ptr <const char []>

केस का उपयोग करें: मान लीजिए कि आप कुछ बफर में सी स्ट्रिंग बनाते हैं। अपवाद के मामले में उचित सफाई सुनिश्चित करने के लिए, बफर unique_ptr का उपयोग करके संदर्भ हो सकता है। एक बार स्ट्रिंग का निर्माण हो जाने के बाद, आप स्ट्रिंग के आगे संशोधन से बचने के लिए इसे 0 वर्गघोषित कर सकते हैं, जिसे आप किसी वर्ग के सदस्य को ले जाना चाहते हैं।

यहाँ सबसे अच्छा है मैं अब तक है:

std::unique_ptr<const char[]> res; 
std::unique_ptr<char[]> buf(new char[4]); 
buf[0] = 'f'; 
buf[1] = buf[2] = 'o'; 
buf[3] = '\0'; 
res = std::unique_ptr<const char[]>(const_cast<const char*>(buf.release())); 

आप काम करने के लिए आगे बढ़ नहीं लगता है, शायद अलग Deleter प्रकार की वजह से। यहां तक ​​कि const char को char से स्पष्ट कलाकारों को छोड़ते हुए काम नहीं करता है, के रूप में Should `unique_ptr< T const [] >` accept a `T*` constructor argument?

में चर्चा वहाँ प्राप्त करने के लिए क्या मैं ऊपर उल्लिखित किसी भी बेहतर मुहावरा है? मेरा कोड बहुत बेकार दिखता है और अपेक्षाकृत लंबा लगता है कि अवधारणा पहले कितनी सरल लगती है।

+0

सिर्फ 'रेस = std :: चाल (buf) का उपयोग करना;' मेरे लिए ठीक संकलित वीएस -2010 और वीएस2012 और क्लैंग ट्रंक में (libC++ ट्रंक के साथ)। हालांकि, जीसीसी 4.7.2 चोक करता है। – Xeo

+1

ऐसा लगता है कि जीसीसी 4.8 ट्रंक ने समस्या को ठीक किया है और आप वहां 'res = std :: move (buf)' का भी उपयोग कर सकते हैं। अन्यथा, मुझे नहीं लगता कि आप इस कास्ट चीज़ के आसपास हो सकते हैं। आप लाइन को 'res.reset (const_cast (buf.release())) को छोटा कर सकते हैं; हालांकि, '। – Xeo

+0

@Xeo, जीसीसी 4.8 पर दोनों जानकारी और 'रीसेट' का उपयोग कर छोटे मुहावरे बहुत मूल्यवान हैं। कृपया उन्हें एक उत्तर के रूप में पोस्ट करें। – MvG

उत्तर

6

वीएस -2010 और वीएस2012 की एसडीडीआईबी res = std::move(buf) के साथ विस्तार के रूप में और DR2118 के जवाब के रूप में रूपांतरण की अनुमति देता है। LibC++ और जीसीसी 4.8 के libstdC++ के लिए भी जाता है।

जीसीसी 4.7 के लिए, आप const_cast के आसपास नहीं मिलेगा, लेकिन कम से कम आप कुछ हद तक लाइन को छोटा कर सकते हैं:

res.reset(const_cast<char const*>(buf.release())); 
संबंधित मुद्दे