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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Node * parent = new Node();
parent->addChild(new Cercle());
/* ... */
parent->getChild(0)->setRayon();
... ou encore...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Rectangle* myRect = parent->getChild(0);
... sans devoir faire un cast statique explicite, genre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
(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.