conteneur de T * => casse la constance
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 :
Code:
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 !!!
} |
Je me demande si cette solution (qui semble corriger le problème) est correcte :
Code:
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;
}; |