Question

Si je comprends bien, typeid peut déterminer le type réel polymorphisme, alors que typeof ne peut pas.

Est-il vrai aussi que leurs rendements sont utilisés à des fins différentes: le retour de typeof est utilisé comme mot-clé de type qui peut définir la variable, mais le retour de typeid ne peut pas

?

Est-il possible à la fois obtenir le type réel pour le polymorphisme et utiliser le retour en tant que mot-clé de type pour définir une autre variable? J'espère obtenir le type de classe dérivée d'un pointeur vers la classe de base et définir une variable ou un pointeur vers la classe dérivée. Quelque chose comme:

baseclass *p = new derivedclass  
typexxx(*p) *pp = dynamic_cast<typexxx(*p) *> (p); 
// would like to convert the pointer from pointing to a base class 
// to its derived class

Merci beaucoup!

Était-ce utile?

La solution

c ++ 0x aura decltype qui peut être utilisé comme celui-ci :

int someInt;
decltype(someInt) otherIntegerVariable = 5;

mais pour vieux c ++ plaine, malheureusement, pas.

Je suppose que decltype ne sera pas vraiment beaucoup d'aide soit bien puisque vous voulez le type polymorphes, pas le type déclaré. La voie à suivre plus directement à faire ce que vous voulez est d'essayer de fonte dynamique à un type particulier et vérifier NULL.

struct A {
    virtual ~A() {}
};
struct B : public A {};
struct C : public A {};

int main() {
    A* x = new C;
    if(B* b_ptr = dynamic_cast<B*>(x)) {
        // it's a B
    } else if(C* c_ptr = dynamic_cast<C*>(x)) {
        // it's a C
    }
}

Autres conseils

En supposant une hiérarchie A <- B <- C

A * p = new AorBorC;   // create new object of some sort

if ( dynamic_cast <C*>(p) ) {
  C * c = dynamic_cast <C*>(p);
  c->CFunc();
}
else if ( dynamic_cast <B*>(p) ) {
  B * b = dynamic_cast <B*>(p);
  b->BFunc();
}
else if ( dynamic_cast <A*>(p) ) {
  A * a = dynamic_cast <A*>(p);
  a->AFunc();
}

Où AFunc, BFunc, cfunc sont spécifiques à leurs classes respectives, et non virtuelle. De toute évidence, cela peut être optimisé un peu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top