2016-12-30 7 views
4

私はstd :: unique_ptrがオブジェクトを破壊するためにQObject :: deleteLaterを呼びたいと思います。std :: unique_ptrとQObject :: deleteLater

私はそれを行う方法を理解できません。

私はコンパイルを試みませんでした。

など。

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

助けてください...

加算#1。

OK、私はこれが機能することを発見しました:

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

しかし、私はそれを使用することはあまりにも醜いです。良い方法がありますか? docとして

+0

あなたは&QObjectを:: deleteLater前に削除しようとしています。テンプレート引数がポインタまたは関数自体を必要とするかどうかはわかりません。 – Vality

+0

私はすべての可能な変種を試しました。 –

+0

その場合、私はオブジェクトを受け取り、それに対してdeletelaterメソッドを呼び出すdeletelaterの周りに簡単なテンプレート関数ラッパーを書くでしょう。 – Vality

答えて

7

それは方法によって、非常に非常にシンプルで簡単です。

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は、関数の関数オブジェクトまたは左辺値参照に型unique_ptrをの 引数で呼び出し可能な関数オブジェクトまたは左辺値参照でなければなりません

タイプの要件::ポインタ

ここでstd :: bind、std :: mem_fun、またはlambdaを使用すると、このコンテキストでメンバfuncポインタを使用することはできません。エント


ラムダバージョン:

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

それはあなたには明白なものだと思われます。しかし、私はまだ理解していない。 QScopedPinter/std :: unique_ptrをQObject :: deleteLaterのdeleteorで使う良い方法はありますか? –

+0

あなたの質問に1つお答えしました –

関連する問題