我有一个函数,它使用自定义删除器创建一个unique_ptr并返回它:
auto give_unique_ptr() {
auto deleter = [](int* pi) {
delete pi;
};
int* i = new int{1234};
return std::unique_ptr<int, decltype(deleter)>(i, deleter);
}
在该函数的客户端代码中,我想将其移动unique_ptr
到中shared_ptr
,但是由于我不知道该函数外的自定义删除程序的decltype,因此我不知道该怎么做。
我猜应该看起来像这样:
auto uniquePtr = give_unique_ptr();
auto sharedPtr = std::shared_ptr<..??..>(std::move(uniquePtr));
我必须写什么而不是.. ?? ..才能获得正确的类型?
如果可能的话,当其使用计数达到零时,其shared_ptr
行为是否良好并调用在give_unique_ptr()
函数内部创建的自定义删除程序?
如果您知道(或想显式键入)对象的类型,则可以执行以下操作:
std::shared_ptr<int> sharedPtr(std::move(uniquePtr));
的构造函数std::shared_ptr
将负责删除操作。
但是,如果希望推断类型,则:
auto sharedPtr = make_shared_from(std::move(uniquePtr));
在哪里make_shared_from
:
template<typename T, typename D>
std::shared_ptr<T> make_shared_from(std::unique_ptr<T,D> && p)
{
//D is deduced but it is of no use here!
//We need only `T` here, the rest will be taken
//care by the constructor of shared_ptr
return std::shared_ptr<T>(std::move(p));
};
希望能有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句