Bonsoir,
suite à une discussion que j'ai vu sur comp.lang.c++.moderated (http://groups.google.com/group/comp....6d29b3b6?hl=en),
je me suis effectivement aperçu qu'utiliser un conteneur de T * permettait de casser la constance.
Un exemple :
Je me demande si cette solution (qui semble corriger le problème) est correcte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #include <list> template<typename Node> class Graph { typedef std::list<std::pair<Node *, Node *> > Arcs; public: void addArc(Node * first, Node * second) {_arcs.push_back(std::pair<Node *, Node *>(first, second));} Arcs const & getArcs() const {return _arcs;} private: Arcs _arcs; }; int main() { typedef int Node; Node node0, node1; Graph<Node> graph; graph.addArc(&node0, &node1); Graph<Node> const & pg = graph; Node & node = *pg.getArcs().front().first; // Get a non const reference Node from a const graph node = 3; // Modify a node get from a const graph !!! }
Code : 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 Node> class Graph { typedef std::list<std::pair<Node *, Node *> > Arcs; typedef std::list<std::pair<Node const *, Node const *> > ArcsC; public: void addArc(Node * first, Node * second) {_arcs.push_back(std::pair<Node *, Node *>(first, second));} ArcsC const & getArcs() const {return reinterpret_cast<ArcsC const &>(_arcs);} private: Arcs _arcs; };
Partager