2009-07-06 7 views
4

J'utilise boost::any pour stocker des pointeurs et je me demandais s'il y avait un moyen d'extraire un type de données polymorphes.Boost :: any et polymorphisme

Voici un exemple simple de ce que je souhaite idéalement faire, mais qui ne fonctionne pas actuellement.

struct A {}; 

struct B : A {}; 

int main() { 

    boost::any a; 
    a = new B(); 
    boost::any_cast< A* >(a); 
} 

Ceci échoue car a est en train de stocker un B *, et j'essaie d'extraire un A *. Y a-t-il un moyen d'accomplir cela?

Merci.

Répondre

4

L'autre façon est de stocker un A* dans le boost::any puis dynamic_cast la sortie. Quelque chose comme:

int main() { 
    boost::any a = (A*)new A; 
    boost::any b = (A*)new B; 
    A *anObj = boost::any_cast<A*>(a); 
    B *anotherObj = dynamic_cast<B*>(anObj); // <- this is NULL 

    anObj = boost::any_cast<A*>(b); 
    anotherObj = dynamic_cast<B*>(anObj); // <- this one works! 

    return 0; 
} 
+0

Zifre a raison, static_cast est plus approprié ici. –

3

Malheureusement, je pense que la seule façon de le faire est la suivante:

static_cast<A*>(boost::any_cast<B*>(a)) 
7

Boost.DynamicAny est un vairant sur Boost.Any qui fournit la coulée dynamique plus flexible du type sous-jacent. Alors que la récupération d'une valeur à partir de Boost.Any nécessite que vous connaissiez le type exact stocké dans Any, Boost.DynamicAny vous permet de lancer dynamiquement soit une base ou une classe dérivée du type détenu.

https://github.com/bytemaster/Boost.DynamicAny

+1

Je viens de commencer à l'utiliser: il fonctionne exactement comme je le souhaite ... et aucune allocation de tas/new'ing n'est nécessaire, ce qui rendra l'API que j'écris très propre du point de vue de l'utilisateur. Merci! – andybuckley