2009-03-09 20 views
71

¿Cuál es el equivalente de static_cast con boost::shared_ptr?static_cast con boost :: shared_ptr?

En otras palabras, ¿qué tengo que volver a escribir la siguiente

Base* b = new Derived(); 
Derived* d = static_cast<Derived*>(b); 

cuando se utiliza shared_ptr?

boost::shared_ptr<Base> b(new Derived()); 
boost::shared_ptr<Derived> d = ??? 
+22

¿No debería ser 'Base * b = new Derivado();'? – legends2k

Respuesta

104

Uso boost::static_pointer_cast:

boost::shared_ptr<Base> b(new Derived()); 
boost::shared_ptr<Derived> d = boost::static_pointer_cast<Derived>(b); 
+0

Intenté lanzar y volver a empaquetar el puntero sin formato al principio, sin saber sobre static_pointer_cast. Entonces creo que es útil tener esta información en stackoverflow. – Frank

+4

'boost :: static_pointer_cast (b)' también se puede usar como 'Base' está implícito. – dalle

+4

Sólo pensé en compartir que si está utilizando esto y que la clase Derivada no se ha incluido por completo (es decir, solo se ha declarado como avanzada) obtiene la muy inútil "conversión de tipo no válido:" Base * "a" Derivado * "". Me llevó bastante tiempo mirar la pantalla antes de darme cuenta :) –

22

Hay tres operadores de conversión de punteros inteligentes: static_pointer_cast, dynamic_pointer_cast, y const_pointer_cast. Están en el espacio de nombres boost (proporcionado por <boost/shared_ptr.hpp>) o en el espacio de nombres std::tr1 (proporcionado por Boost o por la implementación TR1 de su compilador).

3

Como comentario: si Derived realmente deriva de Base, entonces deberías usar un dynamic_pointer_cast en lugar de casts estáticos. El sistema tendrá la posibilidad de detectar cuándo/si su lanzamiento no es correcto.

+0

El sistema no puede detectar esto si Base no tiene miembros virtuales. Dynamic_cast es solo mágico en las clases que tienen miembros virtuales. – Aaron

+0

También hay un golpe de rendimiento. Si realmente sabes que el elenco siempre debe tener éxito, static_cast funcionará sin sobrecarga de tiempo de ejecución. –

+0

... sin sobrecarga de tiempo de ejecución * generalmente *. No recuerdo los detalles, pero con la herencia virtual múltiple o algún otro caso de esquina técnicamente hay una sobrecarga, pero aún menor que la emisión dinámica. –

2

Vale la pena mencionar que existe una diferencia en el número de operadores de casting proporcionados por Boost y las implementaciones de TR1.

El TR1 no define la tercera const_pointer_cast operador()

+0

Según [esta referencia] (http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast), 'const_pointer_cast' está disponible en C++ 11. –

Cuestiones relacionadas