カスタム削除機能を使用してunique_ptrを作成し、それを返す関数があります。
_auto give_unique_ptr() {
auto deleter = [](int* pi) {
delete pi;
};
int* i = new int{1234};
return std::unique_ptr<int, decltype(deleter)>(i, deleter);
}
_
その関数のクライアントコードで、_unique_ptr
_を_shared_ptr
_に移動したいのですが、カスタムのdecltypeがわからないため、その方法がわかりません。関数外の削除機能。
私はそれが次のように見えるはずだと思います:
_auto uniquePtr = give_unique_ptr();
auto sharedPtr = std::shared_ptr<..??..>(std::move(uniquePtr));
_
正しいタイプを取得するには、.. ?? ..の代わりに何を書く必要がありますか?
これが可能な場合、_shared_ptr
_は正常に動作し、使用回数がゼロに達したときにgive_unique_ptr()
関数内に作成されたカスタム削除機能を呼び出しますか?
オブジェクトのtypeを知っている(または明示的に入力したい)場合は、次のようにすることができます。
std::shared_ptr<int> sharedPtr(std::move(uniquePtr));
std::shared_ptr
のコンストラクターが削除者の面倒をみます。
ただし、typeを推測したい場合は、次のようにします。
auto sharedPtr = make_shared_from(std::move(uniquePtr));
ここで、make_shared_from
は次のとおりです。
template<typename T, typename D>
std::shared_ptr<T> make_shared_from(std::unique_ptr<T,D> && p)
{
//D is deduced but it is of no use here!
//We need only `T` here, the rest will be taken
//care by the constructor of shared_ptr
return std::shared_ptr<T>(std::move(p));
};
お役に立てば幸いです。
auto uniquePtr = give_unique_ptr();
auto sharedPtr = std::shared_ptr<decltype(uniquePtr)::element_type>(std::move(uniquePtr));
そして、はい、shared_ptr
は、カスタム削除機能を保存し、後で使用します。