web-dev-qa-db-ja.com

カスタム削除機能を備えたunique_ptrをshared_ptrに移動します

カスタム削除機能を使用して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()関数内に作成されたカスタム削除機能を呼び出しますか?

25
j00hi

オブジェクトの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));
};

お役に立てば幸いです。

19
Nawaz
auto uniquePtr = give_unique_ptr();
auto sharedPtr = std::shared_ptr<decltype(uniquePtr)::element_type>(std::move(uniquePtr));

そして、はい、shared_ptrは、カスタム削除機能を保存し、後で使用します。

15
T.C.