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

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

Marsh Posté le 31-08-2004 à 03:13:12    

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
Reply

Marsh Posté le 31-08-2004 à 03:13:12   

Reply

Marsh Posté le 31-08-2004 à 07:04:42    

[:drapo]


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 31-08-2004 à 09:09:50    

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

Reply

Marsh Posté le 31-08-2004 à 09:29:38    

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
Reply

Marsh Posté le 31-08-2004 à 09:33:16    

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
Reply

Marsh Posté le 31-08-2004 à 09:37:00    

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

Reply

Marsh Posté le 31-08-2004 à 09:41:22    

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.

Reply

Marsh Posté le 31-08-2004 à 09:45:01    

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?

Reply

Marsh Posté le 31-08-2004 à 09:52:16    

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

Reply

Marsh Posté le 31-08-2004 à 10:13:17    

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 )-
Reply

Marsh Posté le 31-08-2004 à 10:13:17   

Reply

Marsh Posté le 31-08-2004 à 12:41:27    

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 !
@++

Reply

Marsh Posté le 31-08-2004 à 13:01:07    

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

Reply

Marsh Posté le 31-08-2004 à 13:05:32    

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
Reply

Marsh Posté le 31-08-2004 à 17:42:05    

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

Marsh Posté le 31-08-2004 à 17:57:24    

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 ! @+

Reply

Marsh Posté le 31-08-2004 à 17:58:37    

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

Reply

Marsh Posté le 31-08-2004 à 18:03:19    

Je le retrouve pas :/

Reply

Marsh Posté le 02-09-2004 à 15:07:46    

Reply

Marsh Posté le 03-09-2004 à 09:47:20    

[:drapal]

Reply

Sujets relatifs:

Leave a Replay

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