weak_ptr unique_ptr shared_ptr example create c++ c++11 shared-ptr c++14 unique-ptr

c++ - example - Mueva un unique_ptr con un eliminador personalizado a shared_ptr



unique_ptr c++ (2)

Tengo una función que crea un unique_ptr con un eliminador personalizado y lo devuelve:

auto give_unique_ptr() { auto deleter = [](int* pi) { delete pi; }; int* i = new int{1234}; return std::unique_ptr<int, decltype(deleter)>(i, deleter); }

En el código de cliente de esa función, me gustaría mover el unique_ptr a shared_ptr , pero no sé cómo hacerlo porque no sé el tipo de declive de mi eliminador personalizado fuera de la función.

Supongo que debería verse algo como esto:

auto uniquePtr = give_unique_ptr(); auto sharedPtr = std::shared_ptr<..??..>(std::move(uniquePtr));

¿Qué tengo que escribir en lugar de ... ?? .. para obtener el tipo correcto?

Si esto es posible, ¿ shared_ptr comportará bien y llamará a mi eliminador personalizado creado dentro de la función give_unique_ptr() cuando el recuento de uso llegue a cero?


Si conoce (o quiere escribir explícitamente) el tipo de objeto, puede hacer esto:

std::shared_ptr<int> sharedPtr(std::move(uniquePtr));

El constructor de std::shared_ptr se hará cargo del deletor.

Sin embargo, si usted quiere que se infiera el tipo , entonces:

auto sharedPtr = make_shared_from(std::move(uniquePtr));

donde make_shared_from es:

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)); };

Espero que ayude.


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

Y sí, el shared_ptr almacenará, y luego usará, el eliminador personalizado.