将带有自定义删除器的 unique_ptr 移动到 shared_ptr
Move a unique_ptr with custom deleter to a shared_ptr
我有一个函数可以创建一个带有自定义删除器的 unique_ptr 和 returns 它:
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()
函数中创建的自定义删除器?
auto uniquePtr = give_unique_ptr();
auto sharedPtr = std::shared_ptr<decltype(uniquePtr)::element_type>(std::move(uniquePtr));
是的,shared_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));
};
希望对您有所帮助。
我有一个函数可以创建一个带有自定义删除器的 unique_ptr 和 returns 它:
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()
函数中创建的自定义删除器?
auto uniquePtr = give_unique_ptr();
auto sharedPtr = std::shared_ptr<decltype(uniquePtr)::element_type>(std::move(uniquePtr));
是的,shared_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));
};
希望对您有所帮助。