将带有自定义删除器的unique_ptr移动到shared_ptr

时间:2015-06-24 18:41:20

标签: c++ c++11 shared-ptr c++14 unique-ptr

我有一个函数,它使用自定义删除器创建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,但我不知道如何做到这一点,因为我没有&# 39;在函数之外知道我的自定义删除器的decltype。

我想它看起来应该是这样的:

auto uniquePtr = give_unique_ptr();
auto sharedPtr = std::shared_ptr<..??..>(std::move(uniquePtr));

我需要写什么代替 .. ?? .. 才能获得正确的类型?

如果可以,shared_ptr表现得很好,并且当give_unique_ptr()功能的使用次数达到零时调用我在<button class="button button--ok ripple">Button</button> <button class="button button--cancel ripple">Button</button> 功能中创建的自定义删除器吗?

2 个答案:

答案 0 :(得分:19)

如果您知道(或想要明确键入)对象的类型,那么您可以这样做:

std::shared_ptr<int> sharedPtr(std::move(uniquePtr));

std::shared_ptr的构造函数将处理deletor。

但是,如果您想要推断类型,那么:

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));
};

希望有所帮助。

答案 1 :(得分:15)

<library:SlideView x:Name="SlideView" IsSlideEnabled="True" SelectedIndex="0">
<Grid>
    ....... Display Post .......
</Grid>
<Grid>
    ....... People List .......
</Grid>
<Grid>
    ....... Cart .......
</Grid></library:SlideView>

是的,{{1}}将存储 - 以后再使用 - 自定义删除器。