gpt4 book ai didi

c++ - std::unique_ptr,自定义删除器和类型更改

转载 作者:行者123 更新时间:2023-11-30 02:27:42 24 4
gpt4 key购买 nike

我想在删除器中使用 unique_ptr。我希望带有删除器的 unique_ptr 与带有默认删除器的 unique_ptr 完全兼容。

我这样做了:

template <typename T>
struct QObjectDeleteLaterDeletor :
public std::default_delete<T>
{
void operator()(T *p)
{
p->deleteLater();
}
};

template <typename T, class... Args>
std::unique_ptr<T> qtMakeUniqueSpecial(Args&&... args)
{
return std::unique_ptr<T>(
new T(std::forward<Args>(args)...),
QObjectDeleteLaterDeletor<T>());
}

这编译,但不工作。我的自定义删除器被忽略,而是使用默认删除器,就好像我根本没有指定它一样。

我需要所有这些才能做这样的事情:

auto ptr1 = qtMakeUniqueSpecial<MyObject>();
std::unique_ptr<MyObject> ptr2;
ptr2 = std::move(ptr1);

请注意,现在即使是 ptr1.reset() 也会导致调用标准删除器,而不是我的删除器。

有可能吗?

最佳答案

您需要指定 QObjectDeleteLaterDeletor作为模板参数;否则,std::default_delete将用作删除器,它是从 QObjectDeleteLaterDeletor 切片复制的.

template <typename T, class... Args>
std::unique_ptr<T, QObjectDeleteLaterDeletor<T>> qtMakeUniqueSpecial(Args&&... args)
{
return std::unique_ptr<T, QObjectDeleteLaterDeletor<T>> (
new T(std::forward<Args>(args)...),
QObjectDeleteLaterDeletor<T>());
}

请注意,您声明了 ptr2作为std::unique_ptr<MyObject> , 然后 ptr2将通过 std::default_delete 销毁指针.如果你声明它的类型符合 ptr1喜欢auto ptr2 = std::move(ptr1);那么它会没事的。

关于c++ - std::unique_ptr,自定义删除器和类型更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41415236/

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