2017-10-18 234 views
6

我正在更新一些pre-C++ 11代碼以使用C++ 11 unique_ptrs。在條件或循環中分配智能指針

我不確定如何處理的一件事是舊代碼使用指針分配作爲條件。例如。

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

鑑於性病::的unique_ptr ::重置沒有返回值,它不可能直接轉化這:

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

那麼,什麼是升級該代碼使用unique_ptrs最徹底的方法?我能想出的最好的是:

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

,它允許: 'while(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'是否爲null(通過它的'bool'轉換運算符),所以不需要檢查循環體內的obj'是否爲null –

+0

@RemyLebeau,你是對的:) –

+4

你需要'std :: unique_ptr '除非'C++ 17' – balki

2

如果你想保持obj活着外循環,可以用逗號:如果您使用C++ 17

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

我從來沒有遇到過這種逗號的使用 - 但在這種情況下,這是一個非常優雅的解決方案! – ndawson