gpt4 book ai didi

c++ - `std::unique_ptr` 的(不同的)助手

转载 作者:行者123 更新时间:2023-11-28 05:48:58 24 4
gpt4 key购买 nike

我看到只有一个非成员实用程序助手与 std::unique_ptr 相关联, 它调用 new .无需显式命名类型即可包装现有原始指针的实用程序怎么样?

特别是,假设有遗留代码或外部库有这样的东西:

C* foo();  // caller is responsible for deleting

也就是说,一些函数应该被写成返回一个unique_ptr<C> ,但不是,调用者无法更改它。

我认为使用这个函数的正确方法是:

unique_ptr<C> up (foo());

但这需要命名类型,而不是使用 auto .它回避了一个问题,即为什么没有一个辅助函数可以使用模板参数推导并编写如下内容:

auto up= capture_unique(foo());

理想情况下,甚至提供 =声明变量的语法,以及自行确定类型的语法。

这么自然的写法,想不到我是第一个想到的。是否有一些隐藏的危险使得不可能在足够一般的情况下写这个?或者,什么原因没有随make_unique一起提供?和 unique_ptr模板作为标准的一部分?

最佳答案

满足您描述的要求的最简单代码是;

template<typename T>
auto capture_unique(T* ptr)
{
return std::unique_ptr<T>{ptr};
}

这将与示例代码一起很好地工作;

auto up = capture_unique(foo());

capture_unique 之间基本上没有什么区别并且只使用 unique_ptr直接构造函数,而不是像你说的那样重新输入类型 C .

auto up = std::unique_ptr<C>{foo()};

对于通用代码,您可以使用 decltypedeclval等。可能不存在通用用例。

std::shared_ptr 存在同样的问题再次没有“捕获”类型的辅助方法,创建一个就足够简单了。 shared_ptr之间的区别案例和 unique_ptr删除器是 unique_ptr 类型的一部分吗?而不是 shared_ptr .

Is there some hidden peril that makes it impossible to write this in a general enough case?

没有隐藏的危险,只是一些关于使用什么类型的未回答的一般性问题。但创建起来很容易,如上所述。

Or, what reason is it not provided along with make_unique and the unique_ptr template as part of the standard?

作为类型的一部分的删除器可能是不创建实用程序捕获方法的一个很好的理由(因此它不会为 shared_ptr 镜像)。 capture_unique如果删除器是默认的 delete,将无法提供更好的语法- 它可能更麻烦。

注意:两种“工厂”方法,make_uniquemake_shared使用 new运算符并将其与默认值 delete 结合删除器。

关于c++ - `std::unique_ptr` 的(不同的)助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35666158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com