【发布时间】:2016-09-17 14:16:31
【问题描述】:
我遇到过类似的代码
bool open_resource(..., shared_ptr<resource> & res)
{
...
shared_ptr<resource> newResource(new resource(...));
res = move(newResource);
return true;
}
然后用
调用shared_ptr<resource> res;
open_resource(..., res);
然后,据我所见, res 不以需要共享指针的方式使用。
当然我马上就想到了改变
shared_ptr<resource> newResource(new resource(...));
res = move(newResource);
与
res = make_shared<resource>(...)
...但后来我遇到了障碍。现在我不能再建议将 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;
}
但是真的不满意。
有没有人看到更好、更 C++ 的解决方案?
编辑
是的,C++ 方法是返回指针而不是布尔值(并检查空值)。在这种情况下,我无法为 shared_ptr 重载,但我可以将返回的 unique_ptr 临时分配给 shared_ptr 变量,并且适当的构造函数将对其进行转换。
但是,这样我就失去了make_shared的单一分配。我可以保存吗?
【问题讨论】:
-
为什么不
shared_ptr<resource> open_resource(....);? -
不知道它是否符合您的需求,但使用标准释放器(删除)unique_ptr 与裸ptr 大小相同。 API 中的开销最小且意图明确。
-
@juanchopanza 我知道,我知道,但是返回码/输出参数语法是如此普遍,以至于我不再在这种情况下质疑它。如果它启用了其他方式无法实现的功能,我建议更改它。
-
@ErikAlapää 我知道。我很高兴能够尽可能使用 unique_ptr,但我没有看到一个简单的方法。
-
@FrancescoDondi:不,您不需要两个函数:只需返回一个
unique_ptr- 它可以按需转换为共享函数。
标签: c++ c++11 smart-pointers