我希望我的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);
但是使用它对我来说太难看了。有好办法吗?
答案 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);