2009-10-27 8 views
4

J'utilise boost :: any pour avoir des types polymorphes, j'ai besoin de pouvoir convertir un objet en son type de base.comment utiliser boost :: any_cast (bibliothèque c + + +) pour convertir les types de base?

class A { 
    public: 
     int x; 
     virtual int foo()= 0; 
}; 

class B : public A { 
    public: 
     int foo() { 
      return x + 1; 
     } 
}; 


int main() { 
    B* bb = new B(); 
    boost::any any = bb; 
    bb->x = 44; 
    A* aa = boost::any_cast<A*>(any); 
} 

Le code de la fonction principale jette l'erreur suivante lors de l'exécution:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_any_cast> >' 
    what(): boost::bad_any_cast: failed conversion using boost::any_cast 
Abort trap 

Si je change le static_cast dans le boost :: any_cast code pour reinterpret_cast il semble fonctionner. Cependant, je ne suis pas sûr des conséquences de cela.

Avez-vous des idées?

Répondre

7

Les mises à jour (vers pointeur vers base) ne nécessitent pas de conversion explicite en C++.

D'autre part, boost::any_cast ne réussira que lors de la conversion au même type que celui initialement stocké. (IIRC il utilise typeid pour vérifier que vous essayez d'accéder au type correct, et les comparaisons de typeid sont seulement vrai pour les correspondances exactes.)

Par conséquent:

A* aa = boost::any_cast<B*>(any); 

Cependant, il est un peu difficile de comprendre pourquoi vous devriez utiliser boost::any pour les types polymorphes. En particulier, ce n'est pas un pointeur intelligent et ne supprimera pas l'objet stocké. Plus commun est de stocker des pointeurs sur un objet polymorphe dans un pointeur intelligent, par exemple boost::shared_ptr<A>

+0

tout objet de stockage par valeur et le supprime – Sergei