Petite question à propos de l'héritage et des templates.
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:
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:
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:
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:
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:
1 2 3
|
if (intersects(static_cast<BoundingVolume<other->children[i]->getType()>*>(other->children[i])))
return true; |
Voilà merci. :)