Salut,
D'habitude, lorsque j'implémente un DP visitor, pour éviter d'avoir à réécrire la fonction accept dans chaque classe fille, je fais ça :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Visited { public: //... virtual void accept(Visitor& visitor) = 0; }; template<typename Tag> class ConcreteVisited : public Visited { public: //... virtual void accept(Visitor& visitor) { visitor.visit(*this); } }; |
Et pour avoir une nouvelle classe fille, je fais un alias et éventuellement une spécialisation selon les besoins.
Cependant, lorsque je spécialise, je suis obligé de réécrire la fonction accept. J'aimerais donc éviter de devoir réécrire accept quand je spécialise.
Au pire, vu que la fonction accept ne changera jamais, je peux me permettre de la réécrire plusieurs fois, mais bon, il vaudrait mieux pouvoir éviter.
Merci d'avance !
EDIT : La solution est assez simple, finalement (merci à jo_link_noir) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Visited { public: //... virtual void accept(Visitor& visitor) = 0; }; template<typename Derived, class VisitedBase = Visited> struct ConcreteVisited : VisitedBase { void accept(Visitor& visitor) override { visitor.visit(static_cast<Derived&>(*this)); } }; struct ConcreteVisited1 : ConcreteVisited<ConcreteVisited1> {}; struct ConcreteVisited2 : ConcreteVisited<ConcreteVisited2> { // ... }; |
+0
-0