Spécialisation d'un type de retour d'une fonction, par template ?
Bonjour,
je me remets au C++ après une bonne dizaine d'années, et je découvre doucement l'utilisation massive des templates et les nouveautés de c++11.
J'ai une petite question pratique:
- j'ai un scengraph, composé d'instances de Node qui elles-même peuvent contenir une liste de Nodes enfants. Et une fonction getChild() pour accéder à ses enfants via un index.
Code:
1 2 3 4 5 6 7 8
| class Node {
public:
void appendChild(Node* child);
Node* getChild(int index);
void setPosition(int x, int y);
private:
std::vector<Node*> children;
}; |
- différentes sous-classes de Node: Rectangle, Cercle, Texte, avec leurs fonctions propres:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Rectangle : public Node {
public:
void setLargeur(int l);
void setLongueur(int L);
private:
int x,y;
}
class Cercle : public Node {
public:
void setRayon(int r)
private:
int rayon;
} |
Le problème: quand je récupère un enfant d'un noeud, je reçois un Node*, donc je ne peux pas appeler directement une fonction spéciale de tel ou tel sous-type de Node (genre setRayon, setLargeur, ...).
Il m'est donc impossible de faire quelque chose du genre:
Code:
1 2 3 4
| Node * parent = new Node();
parent->addChild(new Cercle());
/* ... */
parent->getChild(0)->setRayon(); |
... ou encore...
Code:
Rectangle* myRect = parent->getChild(0);
... sans devoir faire un cast statique explicite, genre:
Code:
(Rectangle*)(parent->getChild(0))->setRayon(123);
J'ai la sensation que c'est quelque chose qui pourrait éventuellement être résolu en utilisant une sorte de 'struct wrapper' template qui proposerait des operateurs de casting pour tous mes sous-types de node. Mais je n'ai aucun idée de sa réalisation concrète (ni même si c'est possible)
Une idée ?
Merci d'avance.