私はdeleterでunique_ptrを使いたいと思います。 私のdeleterで私のunique_ptrがdefault_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に注意してください)は、標準的な削除手段ではなく、私のいずれかを呼び出すことにつながります。
それは可能ですか?
しかし、移動後、 'ptr1'はデータへのポインタを持ちません。 "削除"への移動後に 'ptr1'で' reset'を呼び出すことは意味がありません。あなたは[最小限の、完全で、証明可能な例](http://stackoverflow.com/help/mcve)を作成して私たちを見せてください。また、あなたのdeleterが呼び出されないことをあなたがどのように知っているかを教えてください。*デフォルトはです。 –
いいえ、あなたがしていることはあなたのファンシーデリターを 'default_delete'にスライスしているだけです。 –
もちろん、移動前にリセットを呼びます。最小限の例は疑問です。 –