聪明智能指针:避免shared_ptr过度使用

Fra*_*ndi 3 c++ smart-pointers c++11

我遇到过类似的代码

bool open_resource(..., shared_ptr<resource> & res)
{
   ...
   shared_ptr<resource> newResource(new resource(...));
   res = move(newResource);
   return true;
}
Run Code Online (Sandbox Code Playgroud)

随后调用

shared_ptr<resource> res;
open_resource(..., res);
Run Code Online (Sandbox Code Playgroud)

然后,就我所见,res不会以需要共享指针的方式使用.

我当然想到了改变

   shared_ptr<resource> newResource(new resource(...));
   res = move(newResource);
Run Code Online (Sandbox Code Playgroud)

res = make_shared<resource>(...)
Run Code Online (Sandbox Code Playgroud)

......但后来我遇到了障碍.现在我再也不能建议将shared_ptr引用更改为更基本的引用; 至少不是如果我想确保,如果调用者实际上需要以后的shared_ptr,则控制块有效地驻留在与对象相同的分配上.要使其工作,它必须从头开始是shared_ptr.

另一方面,shared_ptr是一种"重型"; 它有两个计数器和别名以及在大多数呼叫站点中真正看起来不需要的各种功能.然而,如果它是签名中的shared_ptr,那么他们必须使用它.

我看到的最佳解决方案是将函数体移动到辅助函数,然后重载.

bool get_resource_parameters(Param1& param1,..., ParamN& paramN)
{
   ...
}

bool open_resource(..., shared_ptr<resource> & res)
{
   Param1 param1;
   ...
   ParamN paramN;
   if(!get_resource_parameters(param1,...,paramN))
       return false;

   res = make_shared<resource>(param1,...,paramN);
   return true;
}

bool open_resource(..., unique_ptr<resource> & res)
{
   Param1 param1;
   ...
   ParamN paramN;
   if(!get_resource_parameters(param1,...,paramN))
       return false;

   res = unique_ptr<resource>(new resource(param1,...,paramN));
   return true;
}
Run Code Online (Sandbox Code Playgroud)

但它真的不令人满意.

有没有人看到更好的,更多的C++解决方案?

编辑

是的,C++方式是返回指针而不是bool(并检查null).在这种情况下我不能为shared_ptr重载,但我可以将unique_ptr临时返回到shared_ptr变量,并且相应的构造函数将转换它.

但是,这样我就失去了make_shared的单一分配.我可以保存吗?

Max*_*kin 12

std::shared_ptr有一个转换构造函数std::unique_ptr.为什么不让函数std::unique_ptr按值返回:

unique_ptr<resource> open_resource(...);
Run Code Online (Sandbox Code Playgroud)

这也可以作为文档,这是一个工厂函数,将所有权转移resource给调用者.

让来电者决定他们想要的方式:

auto x = open_resource(...);
// or
std::shared_ptr<resource> x{open_resource(...)};
Run Code Online (Sandbox Code Playgroud)