next up previous contents
Next: Free Store Up: Performance Previous: Performance

Spécialisation d'une template

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;
 }



Pironneau Olivier
Jeudi 26 juin 1997 07:15:20