Salut,

je voudrais savoir si il est possible de récupérer le type d'un objet dérivé à partir de la classe de base en c++ afin de l'insérer dans un template.

J'ai une classe BoundingVolumeBase qui me sert juste à stocker un tas de volumes englobants de type différents :

Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
class BoundingVolumeBase {
}

Ma classe BoundingVolume est template, donc, et je veux pouvoir stocker des volumes enfants de n'importe quel type, je fais donc hériter cette classe de BouningVolumeBase et j'utilise type erasure :

Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
template <typename D>
class BoundingVolume : public BoundingVolumeBase {
private :
    std::vector<BoundingVolumeBase*> children;
    typedef D& type;
};

Pour caster les objets de type BoundingVolumeBase en BoundingVolume<D> j'ai besoin de connaitre le type de D à la compilation, je suis donc obligé de faire ceci :

Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
class BoundingVolumeBase {
         virtual std::string getType() = 0;
}

Et de redéfinir cette méthode dans ma classe BoundingVolume et dans toutes les classes héritant de boundingvolume, ainsi je peux connaitre le type et faire un downcast à l'aide d'un if :

Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
template<typename C>
bool intersects(BoundingVolume<C> other) {
       if (children.size() == 0 && other->children.size() == 0) {
              return intersects(*static_cast<C*>(other));
       } else if (children.size() == 0 && other->children.size() != 0) {
              for (unsigned int i = 0; i < other->children.size(); i++) {  
                    if (other->chirldren[i]->getType() == "BoundingBox") {
                         if (intersects(static_cast<BoundingVolume<BoundingBox>*>(other->children[i])))
                             return true;
                    }   
              }
       }      
}

Mais ceci me parait assez lourd à faire surtout si j'ai beaucoup de classes qui héritent de BoundingVolume, j'aimerais savoir si en c++11 il n'y a pas moyen de récupérer le type de la sous classe à partir de la classe de base et faire un truc comme ceci :

Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
if (intersects(static_cast<BoundingVolume<other->children[i]->getType()>*>(other->children[i])))
       return true;

Voilà merci.