std :: unique_ptr和QObject :: deleteLater

时间:2016-12-30 20:13:07

标签: qt c++11

我希望我的std :: unique_ptr调用QObject :: deleteLater来破坏对象。

我无法弄明白该怎么做。

我没有尝试编译。

E.g。

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

但是使用它对我来说太难看了。有好办法吗?

2 个答案:

答案 0 :(得分:10)

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

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 :(得分:1)

正如doc所说:

  

类型要求

     

-Deleter必须是FunctionObject或lvalue引用的FunctionObject或lvalue函数引用,可以用一个函数调用   unique_ptr :: pointer

类型的参数

你在std :: bind,std :: mem_fun或lambda中被“困住”,你不能在这个上下文中使用成员func指针,因为它不满足要求

lambda版本:

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