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

  FORUM HardWare.fr
  Programmation
  C++

  [C++/template] Eléments syntaxiques en paramètres template ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++/template] Eléments syntaxiques en paramètres template ?

n°837341
Evadream -​jbd-
Posté le 31-08-2004 à 03:13:12  profilanswer
 

Bonjour tout le monde,
 
J'ai pensé à quelque chose de farfelue. Serait-il imaginable d'utiliser les arguments templates comme des éléments syntaxiques du langage ? L'idée serait d'obtenir un effet "macro".
 
Imaginons que le mot clé verbatim indique un argument template "syntaxique", on peut donner l'exemple bidon (comme le reste ?) suivant :  

Code :
  1. template <verbatim STX>
  2. void foo()
  3. {
  4.     STX ;
  5. }
  6. ...
  7. foo<  if (1) > bar ;


 
Ca existe déja ? Il y a un moyen pour arriver au même résultat ? C'est débile ?
 
Je me pose cette question car je viens de récupérer un projet qui filtre des images binaires à l'aide d'opérateurs morphologiques, et y'a 16 fonctions (Golay & Co) qui différent uniquement sur un test, dans le genre :  
 

Code :
  1. void filtre_1(image& img)
  2. {
  3.   for(int x...) for(int y...)
  4.     // au plus 9 tests, voisinage 3x3
  5.     if( img(x,y) && !img(x-1,y-1) && img(x-1,y) .... ) img(x,y) = ... ;
  6. }


J'aurais bien fait un modèle pour la fonction filtre prenant 9 paramètres template controlant le if, mais je ne vois pas trop comment m'y prendre, d'où ma précédente "idée" de produire des élements syntaxiques à l'aide des templates.  
 
J'ai pensé utilisé un if version template, j'aurais aimé pouvoir faire qqchose comme çà :

Code :
  1. // c'est n'importe quoi, mais c'est l'idée
  2. template<bool t, code si t == true, code si t == false>
  3. struct IF ;
  4. //... la suite qui va bien
  5. template<int A, int B, int C,
  6.                  int D, int E, int F,
  7.                  int G, int H, int I>
  8. void filter(image& img)
  9. {
  10.          for(int x...) for(int y...)
  11.          // on continue dans l'hypothétique
  12.          if ( IF< A == 0, !img(x-1,y-1), img(x-1,y-1) > &&
  13.               IF< B == 0, !img(x,y-1), img(x,y-1) > && ...
  14.           ) img(x,y) = ...
  15. }
  16. filter<0,0,1
  17.        0,1,1
  18.        0,0,1> L1 ;
  19. ....


 
Il y a peut-être (surement) une solution élégante à mon problème, mais je ne vois pas  trop comment m'y prendre. Avec des macros ? Je ne suis pas un pro du préprocesseur, mais je ne peux pas utiliser de constantes (0,1,2...) dans la déclaration de celles-ci il me semble, sinon le problème pourrait être régler avec çà à priori.
 
Il est 3h du mat, je sais pas trop quoi penser de ce que je viens d'écrire [:misterpinguin].  on verra les réponses demain, si y'en a [:ddr555]
 
@+ tout le monde !


Message édité par Evadream -jbd- le 31-08-2004 à 03:46:52
mood
Publicité
Posté le 31-08-2004 à 03:13:12  profilanswer
 

n°837349
kadreg
profil: Utilisateur
Posté le 31-08-2004 à 07:04:42  profilanswer
 

[:drapo]


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°837381
Taz
bisounours-codeur
Posté le 31-08-2004 à 09:09:50  profilanswer
 

non ça n'existe pas... à raison, puisque ce que tu décris, c'est tout simplement un macro ...

n°837391
mynab
Posté le 31-08-2004 à 09:29:38  profilanswer
 

A mon avis la solution elegante de faire cela serait plutot que ton element syntaxique soit l'appel d'une methode statique d'une classe que tu passes en parametre.
 

Code :
  1. template <class T>
  2. int foo(int a, int b)
  3. {
  4.     return T::perform(a,b);
  5. }
  6. class add
  7. {
  8.   static int perform(int a, int b) { return a+b; }
  9. };
  10. class sub
  11. {
  12.   static int perform(int a, int b) { return a-b; }
  13. };
  14. cout << foo<add>(1,2)
  15. cout << foo<sub>(5,2)


 
Pas essaye de compiler mais ca doit marcher
 
mynab


Message édité par mynab le 31-08-2004 à 09:30:09
n°837394
mynab
Posté le 31-08-2004 à 09:33:16  profilanswer
 

Aux "public:" pres qui manquent dans add et sub ca compile et ca marche.
 
Ok pas aussi pratique que ce que tu veux faire parce qu'il faut declarer les classes add et sub mais bon.


Message édité par mynab le 31-08-2004 à 09:33:30
n°837397
Taz
bisounours-codeur
Posté le 31-08-2004 à 09:37:00  profilanswer
 

c'eut été trop facile d'utiliser std::plus et std::minus ainsi que tout autre fonctor (et operator() :o )

n°837401
mynab
Posté le 31-08-2004 à 09:41:22  profilanswer
 

Oui c'est vrai un functor revient au meme. Mais bon c'est vrai qu'en y reflechissant on s'eloigne ce que veux faire evadream a la base...
 
Le pb des macros dans ce cas la c'est que je pense pas que ce soit super elegant meme si effectivement ca resoud le probleme et que j'ai deja utilise ce genre de trucs.

n°837403
mynab
Posté le 31-08-2004 à 09:45:01  profilanswer
 

Remarque: dans le cas d'un functor la methode ne peut pas etre statique si je ne m'abuse et donc ca limite la chose non?

n°837410
Taz
bisounours-codeur
Posté le 31-08-2004 à 09:52:16  profilanswer
 

non, parce que justement avec, tu peux transporter des paramètre. les deux ont leur utilité
 
quant à
 
IF< A == 0, !img(x-1,y-1), img(x-1,y-1) > ne doit pas éxecuter l'opération mais juste rélection l'opération. ton IF< ... > ::result doit être un type qui permet l'opération adéquate
 
tu peux utiliser logical_not<T> dans ton cas

n°837455
blackgodde​ss
vive le troll !
Posté le 31-08-2004 à 10:13:17  profilanswer
 

et avec un truc comme ca ?
 

Code :
  1. template<bool B>
  2. struct ret
  3. {
  4. template <typename T>
  5. static T exec(T var)
  6. {
  7.  return var;
  8. }
  9. };
  10. template<>
  11. struct ret<false>
  12. {
  13. template <typename T>
  14. static T exec(T var)
  15. {
  16.  return !var;
  17. }
  18. };
  19. template<bool A, bool B, bool C, 
  20.   bool D, bool E, bool F,
  21.          bool G, bool H, bool I>
  22. void filter(image& img)
  23. {
  24.          for(int x...) for(int y...)
  25.          // on continue dans l'hypothétique  
  26.   if ( ret<A>::exec(img(x-1,y-1)) &&
  27.               ret<B>::exec(img(x,y-1)) && ...
  28.           ) img(x,y) = ...
  29. }
  30. filter<0,0,1
  31.        0,1,1
  32.        0,0,1> L1 ;
  33. ....


---------------
-( BlackGoddess )-
mood
Publicité
Posté le 31-08-2004 à 10:13:17  profilanswer
 

n°837726
Evadream -​jbd-
Posté le 31-08-2004 à 12:41:27  profilanswer
 

Hello !
 
Tout d'abord merci tout le monde pour vos réponses supers précises !
 
Taz : non ça n'existe pas... à raison, puisque ce que tu décris, c'est tout simplement un macro ...
 
Ok, ca à le mérite d'être clair :) Rapidement, comment t'y prendrais-tu ? J'ai jamais été très doué avec le preprocesseur. Je pensais faire un truc du genre, attention les yeux :

Code :
  1. #define FILTER(1,image,x,y)  image((x),(y))
  2. #define FILTER(0,image,x,y)  !image((x),(y))


Mais ca ne me semble pas possible à cause des constantes dans la déclaration, à juste titre.  
 
mynab : Ca semble pas mal du tout ta solution, je vais voir çà !
 
Taz : IF< A == 0, !img(x-1,y-1), img(x-1,y-1) > ne doit pas éxecuter l'opération mais juste rélection l'opération. ton IF< ... > ::result doit être un type qui permet l'opération adéquate
 
Je bloque sur le type (justement) des paramètres template !img(x-1,y-1) et img(x-1,y-1) à employer ;| Comment faire pour que le code ne soit pas éxécuter ?
 
BlackGoddess : J'aime bien ta solution ! Merci !
 
J'ai plein de choses à voir aujourd'hui ! Merci encore à vous !
@++

n°837741
Taz
bisounours-codeur
Posté le 31-08-2004 à 13:01:07  profilanswer
 

img doit être une instance de quelque chose, ou une le nom d'un fonction. je parlais d'un truc comme à fait BG

n°837747
Evadream -​jbd-
Posté le 31-08-2004 à 13:05:32  profilanswer
 

Ok, c'est bien ce qui me semblait. Effectivement, ce qu'à proposer BlackGoddess est pas mal du tout. C'est ce qui me convient le mieux !
 
Merci encore à tout le monde ! :)


Message édité par Evadream -jbd- le 31-08-2004 à 13:05:44
n°838142
Joel F
Real men use unique_ptr
Posté le 31-08-2004 à 17:42:05  profilanswer
 

:| c'est pas ce que j'explique dans mon topic sur les expressiosn templates et la MPT ???
 
et dans mon topic sur le filtrage digital template ?


Message édité par Joel F le 31-08-2004 à 17:42:53
n°838171
Evadream -​jbd-
Posté le 31-08-2004 à 17:57:24  profilanswer
 

Joel F a écrit :

:| c'est pas ce que j'explique dans mon topic sur les expressiosn templates et la MPT ???
 
et dans mon topic sur le filtrage digital template ?


 
La recherche étant morte c'est pas évident évident :)
 
J'ai pu retrouver ton topic sur le filtrage via google mais ca ne répondait pas tout à fait à mon problème. Ton topic sur la métaprogrammation template m'a permit d'avancer sur la définition du IF template (cf. intervention de Taz sur ton topic).
 
J'ai pas retrouvé ton topic sur les expressions template par contre.
 
Voili voualou :)
 
Merci ! @+

n°838176
Joel F
Real men use unique_ptr
Posté le 31-08-2004 à 17:58:37  profilanswer
 

il est dans le Topic C++ de Taz ^^

n°838190
Evadream -​jbd-
Posté le 31-08-2004 à 18:03:19  profilanswer
 

Je le retrouve pas :/

n°840052
Joel F
Real men use unique_ptr
Posté le 02-09-2004 à 15:07:46  profilanswer
 
n°840781
pains-aux-​raisins
Fatal error
Posté le 03-09-2004 à 09:47:20  profilanswer
 

[:drapal]


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

  [C++/template] Eléments syntaxiques en paramètres template ?

 

Sujets relatifs
J'ai de la peine entre value-of et apply-template[c++] export template...
Template ou XSLT[JSP] [résolu] Problème avec les paramètres de l'URL d'un pg:pager
Cache-Cache d'éléments sous IETableau en parametres
[Delphi] tableaux dynamiques & paramètres[IIS] Changer les paramètres internationnaux de IIS
probleme templateenregistrer des parametres automatiquement
Plus de sujets relatifs à : [C++/template] Eléments syntaxiques en paramètres template ?


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