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

nda*_*son 6 c++ unique-ptr c++11

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

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

Object* obj;
while ( obj = C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() )
{
   // do something with obj
   delete obj;
}
Run Code Online (Sandbox Code Playgroud)

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

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

那么,升级此代码以使用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() );
}
Run Code Online (Sandbox Code Playgroud)

但这增加了对库函数的混乱双重调用,理想情况下我想避免.

Dan*_*man 9

怎么样:

while ( auto obj = std::unique_ptr<Object>( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() ) )
{
   // do something with obj
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过编写`while(std :: unique_ptr <Object> obj {LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT()})来丢失auto.请注意,它必须是C++库调用,而不是C库,因为C allocators和C++ new/delete不兼容. (5认同)
  • 除非`c ++ 17`,否则你需要`std :: unique_ptr <Object>` (4认同)
  • `while`检查`unique_ptr`是否为null(通过它的`bool`转换运算符),因此不需要检查循环体内`obj`是否为null (2认同)