Reprenons la classe des vecteurs de longueurs fixes N
template <class T, int N> class VectN { public:
T val[N];
VectN(const VectN<T,N>& r) ;
// ...
VectN<T,N> VectN<T,N>::operator- (const VectN<T,N>& a)
VectN<T,N> operator/ (const MatN<T,N>& a);
};
template <class T, int N> VectN<T,N>
VectN<T,N>::operator- (const VectN<T,N>& a)
{ VectN<T,N> c(*this);
for(int i=0;i<N;i++) c.val[i]-= a.val[i]; return c;
}
template <class T, int N> VectN<T,N>
VectN<T,N>::operator/ (const MatN<T,N>& a)
{ VectN<T,N> c(0);
if (N==1) { c.val[0] = val[0] / a.val[0][0]; return c;}
else if(N==2) {
T s = a.val[0][0] * a.val[1][1] - a.val[0][1]* a.val[1][0];
if(norm2(s)<eps){ s = eps;}
c.val[0] = (val[0] * a.val[1][1] - a.val[0][1] * val[1]) / s;
c.val[1] = (a.val[0][0] * val[1] - val[0] * a.val[1][0]) / s;
return c;
} else { for(int i =0;i<N;i++) c[i] = val[i]; return c.gauss(a); }
}
Lorsque N=1 la classe n'est pas efficace car les boucles for empechent les inlines. On peut "spécialiser" des fonctions de la template. Par exemple on peut rajouter
inline VectN<float,1>::VectN(const VectN<float,1>& r){ val[0] = r.val[0];}
inline VectN<float,1> VectN<float,1>::operator- (const VectN<float,1>& a)
{
VectN<float,1> c;
c.val[0] = val[0] - a.val[0];
return c;
}
inline VectN<float,1> VectN<float,1>::operator/ (const MatN<float,1>& a)
{
VectN<float,1> c;
c.val[0] = val[0] / a.val[0][0];
return c;
}
inline VectN<float,2>::operator/ (const MatN<float,2>& a)
{
VectN<float,2> c(0);
T s = a.val[0][0] * a.val[1][1] - a.val[0][1]* a.val[1][0];
if(norm2(s)<eps){ s = eps;}
c.val[0] = (val[0] * a.val[1][1] - a.val[0][1] * val[1]) / s;
c.val[1] = (a.val[0][0] * val[1] - val[0] * a.val[1][0]) / s;
return c;
}