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.
Partager