Я хотел бы использовать unique_ptr с моим делетером. Я хотел бы, чтобы мой unique_ptr с моим делетером был полностью совместим с unique_ptr с дефолтом по умолчанию.std :: unique_ptr, изменение пользовательского типа и изменение типа
Я сделал так:
template <typename T>
struct QObjectDeleteLaterDeletor :
public std::default_delete<T>
{
void operator()(T *p)
{
p->deleteLater();
}
};
template <typename T, class... Args>
std::unique_ptr<T> qtMakeUniqueSpecial(Args&&... args)
{
return std::unique_ptr<T>(
new T(std::forward<Args>(args)...),
QObjectDeleteLaterDeletor<T>());
}
компилируется, но не работает. Мой пользовательский отказ игнорируется и используется по умолчанию, как если бы я вообще не указывал его.
Мне нужно, чтобы все это можно сделать что-то вроде этого:
auto ptr1 = qtMakeUniqueSpecial<MyObject>();
std::unique_ptr<MyObject> ptr2;
ptr2 = std::move(ptr1);
Пожалуйста, обратите внимание, что теперь даже ptr1.reset() приведет к вызову стандартного Deleter, не мои один.
Возможно ли это?
Но после перемещения тогда 'ptr1' не имеет указателя на данные. Вызов 'reset' на' ptr1' после перехода на «удаление» не имеет смысла. Можете ли вы создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и показать нам? А также, пожалуйста, сообщите нам * как * вы знаете, что ваш делектор не вызван, а по умолчанию. –
Нет. Все, что вы делаете, нарезает ваш причудливый deleter обратно на 'default_delete'. –
Конечно, я вызываю сброс перед движением. Минимальный пример находится в вопросе. –