2017-10-18 21 views
6

में स्मार्ट पॉइंटर असाइन करें मैं C++ 11 unique_ptrs का उपयोग करने के लिए कुछ पूर्व C++ 11 कोड अपडेट कर रहा हूं।स्थिति या लूप

एक बात मुझे यकीन नहीं है कि कैसे संभालना है, जब पुराना कोड एक शर्त के रूप में सूचक असाइनमेंट का उपयोग कर रहा था। जैसे

std::unique_ptr<Object> obj; 
while (obj.reset(C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT())) 
{ 
    // do something with obj 
} 

तो, unique_ptrs उपयोग करने के लिए इस कोड को उन्नत करने के लिए स्पष्ट तरीका बताया गया है:

Object* obj; 
while (obj = C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT()) 
{ 
    // do something with obj 
    delete obj; 
} 

यह देखते हुए कि std :: unique_ptr :: रीसेट कोई वापसी महत्व है, यह इस सीधे करने के लिए अनुवाद करने के लिए संभव नहीं है ? सबसे अच्छा मैं के साथ आ सकता है:

std::unique_ptr<Object> obj; 
obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT()); 
while (obj) 
{ 
    // do something with obj 
    obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT()); 
} 

लेकिन उस पुस्तकालय समारोह है, जो आदर्श मैं से बचने के लिए चाहते हैं, उसके गंदा डबल कॉल कहते हैं।

+0

आप सी ++ 17 उपयोग कर रहे थे, तो यह अनुमति देता है: 'जबकि (obj.reset (LIBRARY_CALL()); obj)' – aschepler

+0

@aschepler: अब क्या? –

+2

'C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT' जिसे आप हटाते हैं? यह संदिग्ध है। – StoryTeller

उत्तर

9

कैसे के बारे में:

while (auto obj = std::unique_ptr<Object>(C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT())) 
{ 
    // do something with obj 
} 
+2

'while' चेक करता है कि 'unique_ptr' शून्य है (इसके' बूल 'रूपांतरण ऑपरेटर के माध्यम से), इसलिए जांच करने की कोई आवश्यकता नहीं है कि लूप बॉडी –

+0

@RemyLebeau के अंदर' obj' शून्य है या नहीं, सही हैं :) –

+4

आपको 'std :: unique_ptr 'की आवश्यकता है जब तक कि' C++ 17' – balki

2

आप पाश बाहर obj जीवित रखने के लिए चाहते हैं, आप अल्पविराम ऑपरेटर का उपयोग कर सकते हैं:

std::unique_ptr<Object> obj; 
while (obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT()), obj) 
{ 
    // do something with obj 
} 
+0

मुझे पहले कभी कॉमा के इस उपयोग का सामना नहीं करना पड़ेगा - लेकिन इस मामले में यह एक बहुत ही सुरुचिपूर्ण समाधान है! – ndawson

संबंधित मुद्दे