Affectation template & héritage

Affectation template & héritage - C++ - Programmation

Marsh Posté le 01-07-2003 à 14:17:49    

Voila mon probleme :
 
J'utilise les Expressions Templates pour générer du code inline arithmétique.
Actuellement ma syntaxe ressemble à ca :
 
 

Code :
  1. Var<1> x;
  2. Var<2> y;
  3. Vector<char,100> a,b,c;
  4. a = eval(2*x+y,b,c);

 
 
a se retrouve affécté par le resultat du calcul de 2*b+c qui est générée de maniée optimisée à la compil.
 
Quelques details :
 
le type de 2*x+y est le suivant :
 
 

Code :
  1. Xpr<char,BinOp<Xpr<char,Binop<Litteral<char>,Var<1>,OpMul>>,var<2>,OpAdd>

 
 
pas genial à manipuler :/
 
J'aimerais arriver à une syntaxe comme celle ci :
 
 

Code :
  1. Expression<char> f = 2*x+y
  2. a = f(b,c);

 
 
ca parait tout con, il suffit de doter la classe expression du bon operator() et d'un operateur d'affectation qui ressemblerait à :
 
 

Code :
  1. template<class T>
  2. class Expression
  3. {
  4. public:
  5. template<class E>
  6. Expression<T> operator=( Xpr<T,E> expr )
  7. {
  8.    inner_expr = expr;
  9. }
  10. template<int S>
  11. Vector<T,S> operator()( Vector<T,S> v1,Vector<T,S> v2 )
  12. {
  13.   // code bidon simplifiée
  14.   return inner_expr.eval(v1,v2);
  15. }
  16. private:
  17. ????? inner_expr;

 
 
Question ... quel doit etre le type de inner_expr ???
Comment affecter un objet template de type quelconque à une donnée de type fixe ???
 
Merci d'avance.

Reply

Marsh Posté le 01-07-2003 à 14:17:49   

Reply

Marsh Posté le 01-07-2003 à 14:31:17    

Si Xpr est une classe à toi tu la fait dériver d'une classe mère abstraite comme ça toutes les instanciations template auront le même encètre.


Message édité par LetoII le 01-07-2003 à 14:31:32

---------------
Le Tyran
Reply

Marsh Posté le 01-07-2003 à 14:35:02    

un même  ancetre .... oui mais je sais pas comment ca va réagir avec le reste du code template.
 
Et puis, si Xpr herite de Evaluable disons, je met inner_expr de type Evaluable ?
ca va marcher ca ?

Reply

Marsh Posté le 01-07-2003 à 14:53:32    

Joel F a écrit :

un même  ancetre .... oui mais je sais pas comment ca va réagir avec le reste du code template.
 
Et puis, si Xpr herite de Evaluable disons, je met inner_expr de type Evaluable ?
ca va marcher ca ?


 
Bien sur, tu va faire un truc du style:
 

Code :
  1. class Evaluable
  2. {
  3.    public:
  4.            Evaluable &operator=(const Evaluable &source);
  5. };
  6. template<class T,class E>class Xpr : public Evaluable
  7. {
  8. };


 
Et si mes souvenir sont bon ça passe comme une lettre à la poste, après à toi de convenablement gérer la chose dans l'affectation.
 
Par contre là ou ca risque de poser un pb c sur le dépliage...


---------------
Le Tyran
Reply

Marsh Posté le 01-07-2003 à 15:41:58    

Je viens de tester ca marche suf comme tu le dit lors du dépliage.
Le compilo me génére un appel indirect via la vtable.  
Mais dans la fonction qu'il appelle, le code est bien déplié.
Donc comme je pense que le temps d'appel est <<< au temps de calcul ca devrait aller.

Reply

Marsh Posté le 01-07-2003 à 15:45:38    

ouaip, a mon idee le tps d'appel, tu peux l'oublier :D

Reply

Marsh Posté le 01-07-2003 à 15:56:44    

Joel F a écrit :

Je viens de tester ca marche suf comme tu le dit lors du dépliage.
Le compilo me génére un appel indirect via la vtable.  
Mais dans la fonction qu'il appelle, le code est bien déplié.
Donc comme je pense que le temps d'appel est <<< au temps de calcul ca devrait aller.


 
Faut tester, t là pour ça non?  [:ddr555]  
 
Les méthodes virtuelles inline c pas encore ça, je m'en doutais un peu :D


---------------
Le Tyran
Reply

Marsh Posté le 02-07-2003 à 10:05:00    

mmm probleme ...
 
Si je fait :
 

Code :
  1. Expression<float> f = 2*x;
  2. r = f(vec1);

 
 
ca marche bien
Par contre :
 

Code :
  1. Expression<float> f = x*x+x;
  2. r = f(vec1);

 
 
plante lamentablement en core dump :/
Si je trace la chose, j'aboutis à l'endroit ou j'appele la fonction eval
 
Voila un peu plus de code :
 

Code :
  1. template<class T>
  2. class Expression
  3. {
  4.   public:
  5.   typedef typename SIMDType<T>::element_t elt;
  6.   template<class E>
  7.   Function<T>& operator=( const XprVector<T,E>& xpr )
  8.   {
  9.     expr_inner = &(xpr);
  10.     return *this;
  11.   }
  12.  
  13.   elt eval( elt in )
  14.   {
  15.     return expr_inner->eval(in);
  16.   }
  17.  
  18. private:
  19.   Evaluable<T>* expr_inner;
  20. };
  21. template<class T>
  22. struct Evaluable
  23. {
  24.      typedef typename SIMDType<T>::element_t elt;
  25.      virtual elt eval( elt inp ) const =0;
  26. };
  27. template<class T,class A> class XprVector : public Evaluable<T>
  28. {
  29.      public:
  30.      typedef typename SIMDType<T>::element_t elt;
  31.      typedef A expr_t;       
  32.      
  33.              XprVector( const expr_t& expr ) : mExpr(expr) {}
  34.      virtual elt  eval( elt d1 ) const  { return mExpr.eval(d1); }
  35.       private:
  36.      expr_t mExpr;
  37. };

 
 
Voila je suis perdu :??:

Reply

Marsh Posté le 02-07-2003 à 10:21:02    

Check les operateur de tes vecteur, ça doit venir de là.


---------------
Le Tyran
Reply

Marsh Posté le 02-07-2003 à 10:33:13    

non, ca vient pas de la, ca palnte sur l'appel
 

Code :
  1. return expr->eval(in);

 
 
On dirait qu'il appel une fonction virtuelle qui n'existe pas :(

Reply

Marsh Posté le 02-07-2003 à 10:33:13   

Reply

Marsh Posté le 02-07-2003 à 10:45:36    

Joel F a écrit :

non, ca vient pas de la, ca palnte sur l'appel
 

Code :
  1. return expr->eval(in);

 
 
On dirait qu'il appel une fonction virtuelle qui n'existe pas :(


 
C pas plutôt expr qui serait null? :whistle:


Message édité par LetoII le 02-07-2003 à 10:46:20

---------------
Le Tyran
Reply

Marsh Posté le 02-07-2003 à 10:49:43    

Joel F a écrit :

non, ca vient pas de la, ca palnte sur l'appel
 

Code :
  1. return expr->eval(in);

 
 
On dirait qu'il appel une fonction virtuelle qui n'existe pas :(


 
sous VC ca genere un assert ou ca appelle une fonction qui te previens gentillement qu'y a une couille dns le gigot, je sais pu trop, enfin ca plante pas comme une bouse sans rien dire

Reply

Marsh Posté le 02-07-2003 à 10:53:46    

chrisbk a écrit :


 
sous VC ca genere un assert ou ca appelle une fonction qui te previens gentillement qu'y a une couille dns le gigot, je sais pu trop, enfin ca plante pas comme une bouse sans rien dire


 
Ouai mais pour une fois il utilise un vrai compilo  [:ddr555]


---------------
Le Tyran
Reply

Marsh Posté le 02-07-2003 à 10:54:33    

LetoII a écrit :


 
Ouai mais pour une fois il utilise un vrai compilo  [:ddr555]  


 
la punition est a la hauteur de son crime :O :D

Reply

Marsh Posté le 02-07-2003 à 10:55:34    

hmmm expr a une tête bizarre mais c pas NULL ...
je bose pas sous visual mais sous Project Builder ... donc bon ...
 
Je vois vraiment plus la  ...
de toute manière je pense que je m'enlise dans cette voie la, faut que je trouve autre chose ...

Reply

Marsh Posté le 02-07-2003 à 10:59:01    

Joel F a écrit :

hmmm expr a une tête bizarre mais c pas NULL ...
je bose pas sous visual mais sous Project Builder ... donc bon ...
 
Je vois vraiment plus la  ...
de toute manière je pense que je m'enlise dans cette voie la, faut que je trouve autre chose ...
 


 
Ha mon avis t'as bouzé dans l'operateur * :D


---------------
Le Tyran
Reply

Sujets relatifs:

Leave a Replay

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