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

时间:2017-10-18 22:32:20

标签: c++ c++11 unique-ptr

我正在更新一些pre c ++ 11代码以使用c ++ 11 unique_ptrs。

我不确定如何处理的一件事是当旧代码使用指针赋值作为条件时。 E.g。

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

鉴于std :: unique_ptr :: reset没有返回值,因此无法将其直接转换为:

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() );
}

但这增加了对图书馆功能的混乱双重调用,理想情况下我想避免。

2 个答案:

答案 0 :(得分:9)

怎么样:

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

答案 1 :(得分:2)

如果你想让obj在循环之外保持活着,你可以使用逗号运算符:

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