72 votes

static_cast avec boost::shared_ptr ?

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

En d'autres termes, comment dois-je réécrire ce qui suit

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

lors de l'utilisation de shared_ptr ?

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

105voto

Frank Points 16055

Utilisez boost::static_pointer_cast :

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

22voto

Michael Kristofik Points 16035

Il existe trois opérateurs de cast pour les pointeurs intelligents : static_pointer_cast , dynamic_pointer_cast et const_pointer_cast . Ils sont soit dans l'espace de nom boost (fourni par <boost/shared_ptr.hpp> ) ou l'espace de nom std::tr1 (fourni soit par Boost, soit par l'implémentation TR1 de votre compilateur).

3voto

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

2voto

mloskot Points 13971

Il convient de mentionner qu'il existe 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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X