我可以将函数的输出参数存储到 unique_ptr 中吗?
Posted
技术标签:
【中文标题】我可以将函数的输出参数存储到 unique_ptr 中吗?【英文标题】:Can I store a function's output parameter into a unique_ptr? 【发布时间】:2017-07-22 09:50:42 【问题描述】:我有以下代码:
class Thing
;
void fnc(Thing** out)
*out = new Thing();
;
其中fnc
通过输出参数返回Thing
的新实例。通常我会按如下方式使用它:
int main()
Thing* thing;
fnc(&thing);
我可以将返回的对象放在std::unique_ptr
中吗?
int main()
std::unique_ptr<Thing> uniqueThing;
fnc(???);
【问题讨论】:
你需要一个间接,将原始指针传递给 unique_ptr。 为什么不从函数中返回一个指针? @molbdnilo 好点。现在让我们假设该函数返回一个状态码或类似的东西...... 【参考方案1】:为了扩展您的代码示例,它(即指针传递)将是
void fnc(std::unique_ptr<Thing>* out)
out->reset(new Thing());
;
int main()
std::unique_ptr<Thing> uniqueThing;
fnc(&uniqueThing);
或使用传递引用:
void fnc(std::unique_ptr<Thing>& out)
out.reset(new Thing());
;
int main()
std::unique_ptr<Thing> uniqueThing;
fnc(uniqueThing);
但我认为通过返回值返回指针会更清楚:
std::unique_ptr<Thing> fnc()
return std::unique_ptr<Thing>(new Thing);
// or
// return std::make_unique<Thing>();
;
int main()
auto uniqueThing = fnc();
【讨论】:
我喜欢直接输出指向 unique_ptr 的指针/引用的想法!【参考方案2】:您应该将原始指针存储在unique_ptr
中,以便unique_ptr
获得所有权:
Thing* thing;
fnc(&thing);
std::unique_ptr<Thing> thing_unique (thing);
【讨论】:
【参考方案3】:你不能直接这样做。你必须使用一个临时变量:
Thing* thing;
fnc(&thing);
uniqueThing.reset(*thing);
甚至更好,因为fnc
不返回错误代码或其他内容,您可以直接返回新指针,让我们直接编写初始化uniqueThing
:
std::unique_ptr<Thing> uniqueThingfnc();
【讨论】:
【参考方案4】:您需要先从fnc
获取指针,然后创建unique_ptr
,类似于:
Thing* tmp;
find(&tmp);
std::unique_ptr<Thing> thing(tmp);
【讨论】:
以上是关于我可以将函数的输出参数存储到 unique_ptr 中吗?的主要内容,如果未能解决你的问题,请参考以下文章
Pimpl with unique_ptr:为什么我必须将接口构造函数的定义移动到“.cpp”?
C++ 中指向 unique_ptr 函数参数的原始指针的目的是啥?
如何创建一个可以将 std::unique_ptr 作为模板参数正常工作的容器?