2009-03-09 7 views
71

Qual è l'equivalente di static_cast con boost::shared_ptr?static_cast con boost :: shared_ptr?

In altre parole, come devo riscrivere il seguente

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

quando si utilizza shared_ptr?

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

non dovrebbe essere 'Base * b = new Derivato();'? – legends2k

risposta

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

Ho provato a lanciare e rewrapping il puntatore raw all'inizio, non conoscendo static_pointer_cast. Quindi penso che sia utile avere queste informazioni su StackOverflow. – Frank

+4

'boost :: static_pointer_cast (b)' potrebbe anche essere usato come 'Base' è implicito. – dalle

+4

Ho pensato che avrei condiviso che se si utilizza questo e la classe derivata non è stata completamente inclusa (cioè è stata inoltrata) si ottiene la "non valida conversione del tipo:" Base * "a" Derivato * " "". Mi ci è voluto molto tempo per fissare lo schermo prima di averlo capito :) –

22

Ci sono tre operatori del cast di puntatori intelligenti: static_pointer_cast, dynamic_pointer_cast e const_pointer_cast. Sono nello spazio dei nomi boost (fornito da <boost/shared_ptr.hpp>) o nel namespace std::tr1 (fornito da Boost o dall'implementazione TR1 del compilatore).

3

Come commento: se Derivato in realtà deriva da Base, è necessario utilizzare un dynamic_pointer_cast anziché i cast statici. Il sistema avrà la possibilità di rilevare quando/se il cast non è corretto.

+0

Il sistema non può rilevarlo se Base non ha membri virtuali. Dynamic_cast è magico solo per le classi che hanno membri virtuali. – Aaron

+0

Anche c'è un colpo di prestazione. Se sai che il cast dovrebbe sempre avere successo, static_cast funzionerà senza sovraccarico di runtime. –

+0

... nessun sovraccarico di runtime * di solito *. Non riesco a ricordare i dettagli ma con l'ereditarietà multipla virtuale o qualche altro caso d'angolo c'è un sovraccarico tecnico, ma ancora meno di dynamic_cast. –

2

Vale la pena menzionare che c'è una differenza nel numero di operatori di casting forniti da Boost e dalle implementazioni di TR1.

Il TR1 non definisce il terzo operatore di const_pointer_cast()

+0

Secondo [questo riferimento] (http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast), 'const_pointer_cast' è disponibile in C++ 11. –