std::unique_ptr and QObject::deleteLater

8

我希望我的std::unique_ptr在析构对象时调用QObject::deleteLater函数。

我无法想出如何实现它。

我尝试的所有方法都无法编译通过。

例如:

std::unique_ptr<SomeQObject, decltype(&QObject::deleteLater)> var(
                pointer, &QObject::deleteLater);

请帮忙...

补充 #1.

好的,我已经发现这个可以工作:

std::unique_ptr<QObject, decltype(std::mem_fun(&QObject::deleteLater))> var(
            pointer,
            std::mem_fun(&QObject::deleteLater));

与其使用这个:

std::unique_ptr<QObject, decltype(&QObject::deleteLater)> var(
            pointer,
            QObject::deleteLater);

但这太丑了,我不想用它。有没有更好的方法?


你试过在QObject::deleteLater之前去掉&吗?我不确定模板参数希望一个指针还是一个函数本身。 - Vality
我已经尝试了所有可能的变体。 - Alexander Dyagilev
在这种情况下,我会编写一个简单的模板函数包装器,围绕 deletelater 编写,它接受一个对象并调用其 deletelater 方法。 - Vality
template<typename T> 函数 deleteLaterFunc(T foo) { foo.deleteLater() } - Vality
你被困在std::bind、std::mem_fun或lambda中,不能仅仅因为unique_ptr试图更通用并期望可调用对象,就在这种情况下使用成员函数指针。 - Oleg Bogdanov
2个回答

14

顺便说一下,这非常非常简单明了。

struct QObjectDeleteLater {
    void operator()(QObject *o) {
        o->deleteLater();
    }
};

template<typename T>
using qobject_delete_later_unique_ptr = std::unique_ptr<T, QObjectDeleteLater>;

使用方法:

qobject_delete_later_unique_ptr<QObject> ptr(new QFooBar);

如果你能想出一个合理的名称,将会得到额外加分…

1

正如文档所说:

类型要求

-Deleter 必须是 FunctionObject 或者是一个左值引用,指向 FunctionObject 或者是一个左值引用,指向一个可调用的函数,并且该函数能够接受一个 unique_ptr::pointer 类型的参数。

在这里,您可以使用 std::bind、std::mem_fun 或 lambda 表达式,但无法在此上下文中仅使用成员函数指针,因为它不满足要求。


lambda版本:

  auto deleter = [](QObject* obj) {obj->deleteLater();};
  std::unique_ptr<QObject, decltype(deleter)> x(new QObject(), deleter);

对你来说似乎是显然的事情。但我仍然不明白。有没有一种好的方法使用QScopedPointer/std::unique_ptr和QObject :: deleteLater删除器? - Alexander Dyagilev
但是你在问题中已经给出了一个。 - Oleg Bogdanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接