¿Cuál es el mejor método para pasar a shared_ptr
de un tipo derivado a una función que toma a shared_ptr
de un tipo base?
Generalmente paso shared_ptr
s por referencia para evitar una copia innecesaria:
int foo(const shared_ptr<bar>& ptr);
pero esto no funciona si trato de hacer algo como
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
Podría usar
foo(dynamic_pointer_cast<Base, Derived>(bar));
pero esto parece subóptimo por dos razones:
- A
dynamic_cast
parece un poco excesivo para un elenco simple derivado a base. - Según tengo entendido,
dynamic_pointer_cast
crea una copia (aunque temporal) del puntero para pasar a la función.
¿Existe una solución mejor?
Actualización para la posteridad:
Resultó ser un problema de falta de archivo de encabezado. Además, lo que estaba tratando de hacer aquí se considera un antipatrón. Generalmente,
Las funciones que no afectan la vida útil de un objeto (es decir, el objeto sigue siendo válido durante la duración de la función) deben tomar una referencia simple o un puntero, por ejemplo
int foo(bar& b)
.Las funciones que consumen un objeto (es decir, son los usuarios finales de un objeto dado) deben tomar un
unique_ptr
valor por ejint foo(unique_ptr<bar> b)
. Las personas que llaman deben incluirstd::move
el valor en la función.Las funciones que extienden la vida útil de un objeto deben tomar un
shared_ptr
valor por ejemplo, por ejemploint foo(shared_ptr<bar> b)
. Se aplica el consejo habitual para evitar referencias circulares .
Consulte la charla Back to Basics de Herb Sutter para obtener más detalles.
shared_ptr
? ¿Por qué no hay referencia constante de barra?