在条件或循环中分配智能指针
我正在更新一些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());
}
但是,增加了库函数,在理想情况下,我想,以避免杂乱的人通话。
如何:
while (auto obj = std::unique_ptr<Object>(C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT()))
{
// do something with obj
}
'while'检查'unique_ptr'是否为null(通过它的'bool'转换运算符),所以不需要检查循环体内的obj'是否为null –
@RemyLebeau,你是对的:) –
你需要'std :: unique_ptr
如果你想保持obj
活着外循环,可以用逗号:如果您使用C++ 17
std::unique_ptr<Object> obj;
while (obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT()), obj)
{
// do something with obj
}
我从来没有遇到过这种逗号的使用 - 但在这种情况下,这是一个非常优雅的解决方案! – ndawson
,它允许: 'while(obj.reset(LIBRARY_CALL()); obj)' – aschepler
@aschepler:现在是什么? –
'C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT'你删除了吗?那是可疑的。 – StoryTeller