[Development] parented_ptr
Marco Bubke
marco.bubke at qt.io
Thu Oct 16 13:23:17 CEST 2025
On 10/16/25 13:01, Schimkowitsch Robert wrote:
> What about a smart pointer that
> - Tracks it's QObject using QPointer internally
> - In it's destructor, checks if the object still exists
> - If so, checks if the object has a parent
> --> It has a parent: Don't delete
> --> It has no parent: Delete
>
You mean something like:
namespace Internal {
template<typename Type>
struct UniqueObjectPtrDeleter
{
using pointer = QPointer<Type>;
constexpr UniqueObjectPtrDeleter() noexcept = default;
template<typename UpType, typename =
std::enable_if_t<std::is_convertible_v<UpType *, Type *>>>
constexpr UniqueObjectPtrDeleter(const
UniqueObjectPtrDeleter<UpType> &) noexcept
{}
constexpr void operator()(pointer p) const
{
static_assert(!std::is_void_v<Type>, "can't delete pointer to
incomplete type");
static_assert(sizeof(Type) > 0, "can't delete pointer to
incomplete type");
if (not p.parent())
delete p.data();
}
};
} // namespace Internal
template<typename Type>
using UniqueObjectPtr = std::unique_ptr<Type,
Internal::UniqueObjectPtrDeleter<Type>>;
template<typename Type, typename... Arguments>
auto makeUniqueObjectPtr(Arguments &&...arguments)
{
return UniqueObjectPtr<Type>{new
Type(std::forward<Arguments>(arguments)...)};
}
I think you can simply write your own deleter for std::unique_ptr.
More information about the Development
mailing list