Bonjour,
J'ai un problème de conception au niveau des templates et du polymorphisme. Je vais essayer d'expliquer le plus simplement mon problème et mes tentatives de résolution.
Tout d'abord j'ai une classe extractor :
Jusque là, rien de bien compliqué. Du coup j'ai également ces deux classes de dumper :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 template <class Dumper> class extractor { Dumper dumper; char* buffer; public: extractor(char* buffer, Dumper dumper) : buffer(buffer), dumper(dumper){} template<typename raw_type> raw_type extract(); };
Tout va bien sauf que le choix d'un dumper ou d'un autre dépend d'une variable booléenne.
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 struct no_dumper { template<unsigned int N, typename raw_type> void dump(std::string& tag, raw_type data[N]) {} }; class my_dumper { FILE* dump_file; public: my_dumper(FILE* dump) : dump_file(dump) {} template<unsigned int N, typename raw_type> void dump(std::string& tag, raw_type data[N]) { //... } };
Dans ce cas zut, il faut faire hériter extractor d'une classe de base, pour pouvoir manipuler extractor<my_dumper> et extractor<no_dumper> d'une manière uniforme...
Ce que je fais, donc je crée extractor_base, ça compile et évidemment je n'ai pas déclaré mes méthodes virtual donc ce sont celles de extractor_base qui sont appelées et rien ne se passe parce qu'elles sont vides...
Si je les déclare virtual, et bien on ne peut pas car c'est des méthodes templates...
Du coup j'ai pensé a déplacé la virtualité du côté de dumper qui hérite de dumper_base. C'est déjà plus logique mais on a fait que déplacer le problème...
Pour le dumper, je ne peux pas envisager le polymorphisme statique vu qu'il faut un fichier donné à l'exécution.
Par contre, on peut éventuellement choisir le type d'extractor statiquement en fonction d'un const boolean.
Quelle est l'idiome à utiliser, ou quelle partie du design dois-je revoir ?
Merci d'avance.
Partager