2016-12-30 131 views
4

我想我的std ::的unique_ptr調用的QObject :: deleteLater進行破壞的對象。的std ::的unique_ptr和的QObject :: deleteLater

我無法弄清楚如何做到這一點。

沒有我試過編譯。

E.g.

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

但它是太醜了,我使用它。有沒有好的方法?

+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

作爲doc說它:

類型要求

-Deleter必須函數對象或左值參照函數對象或左值參照功能,可調用類型的unique_ptr的 參數::指針

你被std :: bind,std :: mem_fun或lambda'卡住'了,你不能在這個上下文中使用成員func指針,因爲它不滿足requirem經濟需求測試


拉姆達版本:

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

它似乎對你來說很明顯。但我還是不明白。是否有一個很好的方式使用QObject :: deleteLater deletor QScopedPinter/std :: unique_ptr? –

+0

但你給了你一個問題 –