[英]A (different) helper for `std::unique_ptr`
我看到只有一个与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()};
对于通用代码,您可以使用decltype
和declval
等。通用的用例可能不存在。
同样,对于std::shared_ptr
存在一个问题,在该问题中再次没有“捕获”类型的帮助器方法,再次创建一个方法很简单。 shared_ptr
情况和unique_ptr
之间的区别在于,删除器是unique_ptr
而不是shared_ptr
。
是否存在一些隐藏的危险,使得无法在足够普遍的情况下编写此代码?
没有隐藏的危险,只有一些未回答的关于使用哪种类型的一般问题。 但是如上所述,创建起来很容易。
或者,为什么没有将
make_unique
和unique_ptr
模板作为标准的一部分提供?
删除器是该类型的一部分,这很可能是不创建实用程序捕获方法的好理由(因此,该删除器也不会镜像到shared_ptr
)。 如果删除程序是默认的delete
,则capture_unique
将无法提供更好的语法-这可能会比较麻烦。
注意:“工厂”方法make_unique
和make_shared
使用new
运算符,并将其与默认的delete
deleter结合使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.