Std :: unique_ptr and QObject :: deleteLater

I would like my std :: unique_ptr to call QObject :: deleteLater to destroy the object.

I can’t figure out how to do this.

Nothing I tried to compile.

eg.

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

Please, help...

Addendum # 1.

OK, I found that this works:

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

Instead of this:

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

But it is too ugly for me to use it. Is there a good way?

+4
source share
2 answers

This is very simple and understandable, by the way.

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

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

Using:

qobject_delete_later_unique_ptr<QObject> ptr(new QFooBar);

Bonus points if you can come up with a reasonable name ...

+7
source

As the doc says:

Type Requirements

-Deleter FunctionObject lvalue FunctionObject lvalue , unique_ptr:: pointer

"" , std:: bind, std:: mem_fun , func- ,


lambda version:

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

Source: https://habr.com/ru/post/1665366/


All Articles