web-dev-qa-db-fra.com

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 Derived();
Derived* d = static_cast<Derived*>(b);

lors de l'utilisation de shared_ptr?

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

Utilisation boost::static_pointer_cast:

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

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

22

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

Il convient de mentionner qu'il existe une différence dans le nombre d'opérateurs de casting fournis par Boost et les implémentations de TR1.

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

2
mloskot