【问题标题】:std::unique_ptr and QObject::deleteLaterstd::unique_ptr 和 QObject::deleteLater
【发布时间】:2017-05-15 02:29:43
【问题描述】:

我希望我的 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 之前删除 &。我不确定模板参数是否需要指针或函数本身。
  • 我已经尝试了所有可能的变体。
  • 在这种情况下,我会在 deletelater 周围编写一个简单的模板函数包装器,它接受一个对象并在其上调用 deletelater 方法。
  • IE: template&lt;typename T&gt; function deleteLaterFunc(T foo) { foo.deleteLater() } 或一些变体。
  • 你被 std::bind、std::mem_fun 或 lambda 卡住了,你不能仅仅因为 unique_ptr 试图更通用并期望一个可调用的,就在这个上下文中使用成员 func 指针。

标签: qt c++11


【解决方案1】:

顺便说一句,它非常简单明了。

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

如果你能想出一个合理的名字,可以加分......

【讨论】:

    【解决方案2】:

    正如doc 所说:

    类型要求

    -Deleter 必须是 FunctionObject 或对 FunctionObject 的左值引用或对函数的左值引用,可使用 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);
    

    【讨论】:

    • 这对你来说似乎很明显。但我还是不明白。有没有一种很好的方法来使用 QScopedPinter/std::unique_ptr 和 QObject::deleteLater 删除器?
    • 但你在问题中给出了一个
    猜你喜欢
    • 2012-09-19
    • 2023-02-05
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2022-01-20
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多