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.