Bonjour à tous,
je bosse actuellement sur une petite bibliothèque personnelle et j'ai eu besoin d'écrire une classe pour gérer des sortes de vecteurs. Pour certaines raisons, la taille de ces vecteurs ne doit pas être modifiable par l'utilisateur de la bibliothèque. Pour ne pas avoir à re-écrire le même code pour les différentes tailles de vecteurs, j'ai utilisé une classe template du style suivant:
Je voudrais maintenant que l'utilisateur puisse passer directement les valeurs voulues au vecteur créé. Quelque chose comme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 template <unsigned int N> class V { public: V() {} private: float m_data[N]; }; }
Cependant, cela pré-suppose de connaître la taille du vecteur pour déterminer le nombre d'arguments du constructeur. De plus, je ne veux pas que le constructeur à 3 arguments puisse être utilisé pour créer des V<2> ou des V<4>. La solution que j'ai trouvée est de déclarer les prototypes de ces constructeurs mais de n'implémenter que les versions spécialisées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part V<3> v(1.0f, 2.0f, 3.0f);
Cette solution me va pour l'instant mais ne me semble pas très élégante. De plus, l'inconvénient pour l'utilisateur est que si il écrit
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 template <unsigned int N> class V { public: V() {} V(float x, float y, float z); // Constructeur pour V<3> private: float m_data[N]; }; // Pas d'implémentation de V<N>::V(float, float, float) en général // Uniquement celle spécialisée pour V<3> template <> V<3>::V(float x, float y, float z) { m_data[0] = x; m_data[1] = y; m_data[2] = z; }
l'erreur n'apparaît qu'à l'édition des liens et pas à la compilation... Cela bloque bien l'utilisation d'un prototype inadéquate mais ne retourne pas le fichier et la ligne de l'erreur (pas pratique pour le debug).
Code : Sélectionner tout - Visualiser dans une fenêtre à part V<2> v(.0f, .0f, .0f)
Y a-t-il une meilleure solution pour créer des constructeurs spécialisés selon la valeur d'un paramètre passé en template et qui ne soient utilisables que pour certaines valeurs?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $ g++ -c main.cpp $ g++ main.o main.cpp:(.text+0x6b): undefined reference to `V<2u>::V(float, float, float)' collect2: ld returned 1 exit status
Merci à tous
Partager