Bonjour,
Je me demande où, idéalement, se place le code de spécialisation d'une classe template.
Voyons un exemple. J'ai une classe template :
et une classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 // Fichier ClasseBidule.h template<class T> class Bidule { void uneFonction(void); T t; }; template<class T> void uneFonction(void) { // du code générique ici }
Je souhaite spécialiser la méthode uneFonction<A>(void).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 // Fichier ClasseA.h class A { // des machins };
- Le fichier ClasseBidule.h général ne connaît pas (et à mon avis, n'a pas à connaître) la classe A.
- De même, le fichier ClasseA.h ne devrait pas include d'office la définition de la classe Bidule, si par exemple l'utilisation des deux classes et rare.
- Mettre la spécialisation dans un fichier à part demande à l'utilisateur d'être au courant qu'il y a un cas spécial, qui sera donc probablement oublié.
- Une inclusion conditionnelle dans ClasseA.h si la classe Bidule existe pose le problème de l'ordre d'inclusion des fichiers d'en-tête
Au final, le mieux auquel je pense est une inclusion conditionnelle d'un troisième fichier ClasseBidulePourA.hpp dans les 2 fichiers ClasseA.h et ClasseBidule.h.
Il reste comme petit problème le fait que la maintenance de ces deux fichiers est maintenant reliée (si je change le #define indiquant que ClasseA.h est inclu, je doit penser à mettre à jour ClasseBidule.h, et vice versa). Cela reste un moindre mal.
Connaissez vous d'autres/de meilleurs moyens pour faire cela ?
Partager