Prototype du constructeur d'une classe template
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:
Code:
1 2 3 4 5 6 7 8 9
| template <unsigned int N>
class V
{
public:
V() {}
private:
float m_data[N];
};
} |
Je voudrais maintenant que l'utilisateur puisse passer directement les valeurs voulues au vecteur créé. Quelque chose comme
Code:
V<3> v(1.0f, 2.0f, 3.0f);
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:
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;
} |
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:
V<2> v(.0f, .0f, .0f)
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:
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 |
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?
Merci à tous