在条件或循环中分配智能指针

问题描述:

我正在更新一些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

如何:

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

如果你想保持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