2009-03-09 5 views
71

Quel est l'équivalent d'un static_cast avec boost::shared_ptr?static_cast avec boost :: shared_ptr?

En d'autres termes, comment dois-je réécrire les éléments suivants

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

lors de l'utilisation shared_ptr?

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

devrait-il pas être 'base * b = new dérivé();'? – legends2k

Répondre

104

Utilisation boost::static_pointer_cast:

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

J'ai essayé de lancer et de réenvelopper le pointeur brut au début, ne sachant pas static_pointer_cast. Donc je pense qu'il est utile d'avoir cette information sur stackoverflow. – Frank

+4

'boost :: static_pointer_cast (b)' pourrait aussi être utilisé car 'Base' est implicite. – dalle

+4

Je pensais juste partager que si vous utilisez ceci et que la classe Dérivée n'a pas été entièrement incluse (c.-à-d. Qu'elle a été seulement déclarée), vous obtenez la conversion de type invalide très inutile: "Base *" à "Dérivé * "". Il m'a fallu beaucoup de temps à regarder l'écran avant de le comprendre :) –

22

Il y a trois opérateurs de la distribution des pointeurs intelligents: static_pointer_cast, dynamic_pointer_cast et const_pointer_cast. Ils sont soit dans l'espace de noms boost (fourni par <boost/shared_ptr.hpp>) soit dans l'espace de noms std::tr1 (fourni par Boost ou par l'implémentation TR1 de votre compilateur).

3

Comme commentaire: si Derived dérive en fait de Base, alors vous devriez utiliser un dynamic_pointer_cast plutôt que des cast statiques. Le système aura une chance de détecter quand/si votre distribution n'est pas correcte.

+0

Le système ne peut pas détecter cela si Base n'a pas de membres virtuels. Dynamic_cast n'est magique que sur les classes qui ont des membres virtuels. – Aaron

+0

En outre, il y a un coup de performance. Si vous savez vraiment que la distribution doit toujours réussir, static_cast fonctionnera sans surcharge d'exécution. –

+0

... aucun temps d'exécution * généralement *. Je ne peux pas me rappeler les détails, mais avec l'héritage multiple virtuel ou un autre cas de coin, il y a techniquement de la surcharge, mais toujours moins que dynamic_cast. –

2

Il est important de mentionner qu'il y a une différence dans le nombre d'opérateurs de coulée fournis par Boost et les implémentations de TR1.

Le TR1 ne définit pas le troisième opérateur const_pointer_cast()

+0

Selon [cette référence] (http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast), 'const_pointer_cast' est disponible en C++ 11. –

Questions connexes