Pattern visiteur et template
J'essaie d'implémenter le pattern visiteur avec les templates
Je n'ai qu'une seule classe dérivée et templatée
Je travaille avec GCC 4.5 (donc c++11)
fichier VisitorTemplate.hpp (j'ai spécialisé Derived dans le code de visit mais j'aimerais pouvoir utiliser n'importe quel type à l'avenir)
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #ifndef VISITORTEMPLATE_HPP_
#define VISITORTEMPLATE_HPP_
#include <iostream>
#include <string>
using namespace std;
template<class T> class Derived;
class Visitor
{
public:
virtual void visit(Derived<string> *e) = 0;
};
class Base
{
public:
virtual void accept(class Visitor *v) = 0;
};
template<class T>
class Derived: public Base
{
public:
virtual void accept(Visitor *v)
{
v->visit(this);
}
string display(T arg)
{
string s = "This is : " + to_string(arg);
return s;
}
};
class UpVisitor: public Visitor
{
virtual void visit(Derived<string> *e)
{
cout << "do Up on " + e->display("test") << '\n';
}
};
class DownVisitor: public Visitor
{
virtual void visit(Derived<string> *e)
{
cout << "do Down on " + e->display("test") << '\n';
}
};
#endif /* VISITORTEMPLATE_HPP_ */ |
main.cpp
Code:
1 2 3 4 5 6 7 8
|
Base* base = new Derived<string>();
Visitor* up = new UpVisitor();
Visitor* down = new DownVisitor();
base->accept(up);
base->accept(down); |
Edit : j'ai modifié le code avec une déclaration anticipée de Derived et juste en dessous le code de Visitor
Plus d'erreurs
Maintenant je souhaiterais utiliser Derived<T> dans visit; malheureusement visit est virtual et donc impossible d'en faire une méthode template