Bonjour tout le monde !
Je suis en train d'écrire une classe de vecteurs génériques de taille fixe.
J'aimerais simplement pouvoir spécialiser les vecteurs de taille 2 et 3 pour pouvoir ajouter un accès aux coordonnées via
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
vect.x;
vect.y;
vect.z;//Seulement si vect est de type Vector<T, 3>
,
Si je veux spécialiser le template, je dois alors redéfinir toute l'interface de la classe qui est pourtant quasiment la même.
Je ne sais pas bien comment faire cela autrement qu'avec un héritage qui me semble un peu lourd par rapport au besoin...
Si quelqu'un a une suggestion je prend !
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
21
22
23
24
25
26
27
28
29
30
31
32
template<class T, unsigned int d> class Vector{
private:
	T coord[d];
public:
	Vector(const T (&coords)[d]){
		memcpy(coord, coords, sizeof(T)*d);
	}
	template<typename... Ts>
	Vector(Ts&&... coords) : coord{std::forward<Ts>(coords)...} {
		static_assert(sizeof...(Ts) == d, "You must provide d arguments.");
	}
	// Tout plein de fonctions membres très utiles
	// ...
};
// Les spécialisations suivantes ne sont évidement pas correctes !
template<class T> class Vector<T, 2>{
public:
	T& x;
	T& y;
	Vector(const T (&coords)[2]): coord({coord[0],coords[1]}), x(coord[0]), y(coord[1]){}
	Vector(T x, T y) : coord({x,y}), x(coord[0]), y(coord[1]) {}
};
template<class T>  class Vector<T, 3>{
public:
	T& x;
	T& y;
	T& z;
	Vector(const T (&coords)[3]): x(coord[0]), y(coord[1]), z(coord[2]){
		memcpy(coord, coords, sizeof(T)*3);
	}
	Vector(T x, T y, T z) : coord{x, y, z}, x(coord[0]), y(coord[1]), z(coord[2]) {}
};