¿Cuál es el mejor método para pasar a shared_ptrde un tipo derivado a una función que toma a shared_ptrde un tipo base?
Generalmente paso shared_ptrs 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_castparece un poco excesivo para un elenco simple derivado a base. - Según tengo entendido,
dynamic_pointer_castcrea 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_ptrvalor por ejint foo(unique_ptr<bar> b). Las personas que llaman deben incluirstd::moveel valor en la función.Las funciones que extienden la vida útil de un objeto deben tomar un
shared_ptrvalor 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?