Template un peu fin

Template un peu fin - C++ - Programmation

Marsh Posté le 19-02-2003 à 22:54:56    

voila, je bosse sur une bibliotheque de calcul vectoriel utilisant l'architecture SIMD d'Altivec sur PPC G4.
Je suis en train d'encapsuler le concept de vecteur parallele dans un classe qui ressemble comme 2 gouttes d'eau a valarray de la STL.
 
J'utilise evidemment des templates pour pas me faire chier :
 

Code :
  1. template <class T> class VecArray
  2. {
  3. ...
  4. // plein de truc.
  5.   private:
  6.   _vector T* mData;
  7. };


 
le truc ce que dans mes methodes, j'utilise les fonctions C AltiVec (vec_add, vec_madd etc ...) aui ne peuvent prendre comme argument que des types du style :
 
_vector signed char
_vector unsigned char
_vector signed short
_vector unsigned short
_vector signed long
_vector unsigned long
_vector float
 
Mon probleme :
 
Comment restreindre a la compialtion l'instantiation du template VecArray ?
 
CAD autoriser :
 
VecArray<float> monTab;
 
mais interdire
 
VecArray<string> truc;
 
qui n'a aucun sens.
 
 
Merci d'avance  [:joel f]  

Reply

Marsh Posté le 19-02-2003 à 22:54:56   

Reply

Marsh Posté le 19-02-2003 à 23:04:32    

ben justement,c'est la un des problèmes des tempaltes C++, l'absence de contrainte ou l'impossibilité d'imposer un contrat.
 
le mieux: ta classe template tu la fait en privée, elle ne concerne que l'implémentaion, et apres dans le .h à inclure, tu propose des template instanciés tout fait
 
genre.
 
vecarray_bits.h
 


template <class T>
class VecArray
{};
 


 
vecarray.h
 
 
 


#include "vecarray_bits.h"
 
typedef VecArray<float> FloatVecArray;
typedef VecArray<double> DoubleVecArray;

 
 
c'est à mon avis la seule solution pour planquer ton template et emepecher une utilisation

Reply

Marsh Posté le 20-02-2003 à 08:51:15    

c'est en effet une idée.
Je pense que je vais tester ca.
 
Merci :D

Reply

Marsh Posté le 20-02-2003 à 09:26:02    

En s'inspirant de ceci: Why can't I define constraints for my template parameters?

Code :
  1. template <typename T> struct CheckVecArrayAllowed;
  2. template <> struct CheckVecArrayAllowed<signed char   >{};
  3. template <> struct CheckVecArrayAllowed<unsigned char >{};
  4. template <> struct CheckVecArrayAllowed<signed short  >{};
  5. template <> struct CheckVecArrayAllowed<unsigned short>{};
  6. template <> struct CheckVecArrayAllowed<signed long   >{};
  7. template <> struct CheckVecArrayAllowed<unsigned long >{};
  8. template <> struct CheckVecArrayAllowed<float         >{};
Code :
  1. template <class T> class VecArray
  2. {
  3. public:
  4. VecArray(){
  5.  CheckVecArrayAllowed<T>(); //pas de constructeur= type T non géré
  6. }
  7. };
  8. int main(){
  9. VecArray<signed char> (); //ok
  10. VecArray<float      > (); //ok
  11. VecArray<double     > (); //NAN !
  12. }

Il y peut-être moyen de faire mieux.
 
N'oublie pas le type char...


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 20-02-2003 à 09:38:08    

... Ce Bjarne m'etonnera tjrs :D
 
je v digérer tout ca, et venir aux nouvelles.
 
Mercia tous :D

Reply

Marsh Posté le 20-02-2003 à 10:33:46    

Ca aussi ca peut etre pratique :
 
http://boost.org/libs/static_assert/static_assert.htm

Reply

Marsh Posté le 20-02-2003 à 10:41:36    

oui, mais ça depend de ce qu'on veut: interdire purement, ou laisser essayer

Reply

Marsh Posté le 20-02-2003 à 11:09:57    

Interdire clairement, quitte à alléger les assertions si  
ces Mrs de chez Apple nous sortent AltiVec II

Reply

Marsh Posté le 20-02-2003 à 11:25:50    

ben alors soit utilise une méthode pour que ça passe pas à la compilation, soit utilise une technique de fourbe en planquant ton template

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed