Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1496 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Affectation template & héritage

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Affectation template & héritage

n°445165
Joel F
Real men use unique_ptr
Posté le 01-07-2003 à 14:17:49  profilanswer
 

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.

mood
Publicité
Posté le 01-07-2003 à 14:17:49  profilanswer
 

n°445184
LetoII
Le dormeur doit se réveiller
Posté le 01-07-2003 à 14:31:17  profilanswer
 

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
n°445191
Joel F
Real men use unique_ptr
Posté le 01-07-2003 à 14:35:02  profilanswer
 

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 ?

n°445215
LetoII
Le dormeur doit se réveiller
Posté le 01-07-2003 à 14:53:32  profilanswer
 

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
n°445267
Joel F
Real men use unique_ptr
Posté le 01-07-2003 à 15:41:58  profilanswer
 

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.

n°445273
chrisbk
-
Posté le 01-07-2003 à 15:45:38  profilanswer
 

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

n°445287
LetoII
Le dormeur doit se réveiller
Posté le 01-07-2003 à 15:56:44  profilanswer
 

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
n°445985
Joel F
Real men use unique_ptr
Posté le 02-07-2003 à 10:05:00  profilanswer
 

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 :??:

n°446004
LetoII
Le dormeur doit se réveiller
Posté le 02-07-2003 à 10:21:02  profilanswer
 

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


---------------
Le Tyran
n°446019
Joel F
Real men use unique_ptr
Posté le 02-07-2003 à 10:33:13  profilanswer
 

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 :(

mood
Publicité
Posté le 02-07-2003 à 10:33:13  profilanswer
 

n°446037
LetoII
Le dormeur doit se réveiller
Posté le 02-07-2003 à 10:45:36  profilanswer
 

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
n°446040
chrisbk
-
Posté le 02-07-2003 à 10:49:43  profilanswer
 

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

n°446046
LetoII
Le dormeur doit se réveiller
Posté le 02-07-2003 à 10:53:46  profilanswer
 

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
n°446048
chrisbk
-
Posté le 02-07-2003 à 10:54:33  profilanswer
 

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

n°446049
Joel F
Real men use unique_ptr
Posté le 02-07-2003 à 10:55:34  profilanswer
 

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 ...

n°446056
LetoII
Le dormeur doit se réveiller
Posté le 02-07-2003 à 10:59:01  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Affectation template & héritage

 

Sujets relatifs
Ecrire structure dans un fichier + héritage[C++] Objet / héritage : cherche exercice
Template PHPLIB : Comment fonctionne les blocks ?[C/C++] Affectation ou test ? Quel est le mieux ?
[PHP] template engine : patTemplateaddition affectation...
C++ constructeur et heritage ...Affectation d'un tableau de AnsiString dans un autre
[ Python ] Problème héritage # 4 (- update- )héritage et surchage d'opérateur
Plus de sujets relatifs à : Affectation template & héritage


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR