Appels de fonctions non surchargées

Appels de fonctions non surchargées - C++ - Programmation

Marsh Posté le 25-10-2003 à 17:15:00    

Bonjour à tous,
j'ai une question existentiel sur le cpp;
contexte:
Imaginons une class dont la type des variables membres est donné via un template.  
style:

Code :
  1. template <class Elem>
  2. class my_class{
  3. Elem* position;
  4. Elem* color;
  5. public:
  6. my_class(Elem*);
  7. };
  8. template <class Elem>
  9. my_class<Elem>::my_class(Elem* p, Elem* c){
  10. position=p;
  11.         color=c;
  12. //appel fonction
  13. }


 
à la place de "//appel fonction" je voudrai en fait appeler des fonctions différentes en fonction du type Elem par exemple :

Code :
  1. typedef signed char GLbyte;
  2. typedef float GLfloat;
  3. typedef int GLint;
  4. typedef unsigned int GLuint;
  5. typedef unsigned short GLushort;
  6. void glColor3bv (const GLbyte *v);
  7. void glColor3fv (const GLfloat *v);
  8. void glColor3iv (const GLint *v);
  9. void glColor3uiv (const GLuint *v);
  10. void glColor3usv (const GLushort *v);


Evidement si j?avais simplement eu la fonction glColor3() surchargé, le problème ne se serai pas posé ; mais ce n?est pas le cas dans GL.h.
 
La seule solution qui m'est venu à l'esprit est de retapper une fonction glColor3() surchargé qui elle appelera la fonction de GL.h appropriée.
 
style :  

Code :
  1. void glColor3 (const GLbyte *v){
  2.        glColor3bv(v);
  3. }
  4. void glColor3 (const GLfloat *v){
  5.        glColor3fv(v);
  6. }
  7. void glColor3 (const GLint *v){
  8.        glColor3iv(v)
  9. }
  10. //....


 
Cela ce fait il?
Y'a t-il mieux??
 :)
 

Reply

Marsh Posté le 25-10-2003 à 17:15:00   

Reply

Marsh Posté le 26-10-2003 à 11:34:15    

ca depend :O
 
1/ C'est pas mal, pense bien a tout mettre dans le .h pour que le compilo inline tout ca
2/ D'un point de vu perf les fonction glColor3f et consorts sont ce qui se fait de pire :D mais c ptet pas ton soucis du moment
 
 

Reply

Marsh Posté le 27-10-2003 à 08:34:45    

chrisbk a écrit :

ca depend :O
 
1/ C'est pas mal, pense bien a tout mettre dans le .h pour que le compilo inline tout ca
 
 


 
Le mot clef inline il est pas là pour rien non plus :o


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

Marsh Posté le 27-10-2003 à 08:55:08    

LetoII a écrit :


 
Le mot clef inline il est pas là pour rien non plus :o


 
:heink:

Reply

Marsh Posté le 27-10-2003 à 09:03:23    


 

Code :
  1. class MaClasse
  2. {
  3.   public:
  4. int getMonChamp();
  5. private:
  6.   int monChamp;
  7. };
  8. inline int Maclasse::getMonChamp(){return monChamp;}


 
Fait la même chose que:
 

Code :
  1. class MaClasse
  2. {
  3.   public:
  4. int getMonChamp()
  5. {
  6.   return monChamp;
  7. }
  8. private:
  9.   int monChamp;
  10. };


 
Dans un cas tu déclare explicitement la méthode comem inline, dans l'autre tu le fais implicitement.
 
Après c juste une question de rpésentation.


Message édité par LetoII le 27-10-2003 à 09:04:49

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

Marsh Posté le 27-10-2003 à 09:06:10    

Bah la je vais parler pour VC6/2002 vu que c les compilos que j'ai le plus utilisé.
 
Si tu la joue comme ca et que tu balances l'implementation de ta fonction dans un fichier non accessible au travers du .h et/ou du cpp en cours de compil, tu va te manger une vilaine erreur de link (j'imagine que les inlines ne sont pas compilés(?) et que comme le compilateur n'a pu trouver l'implem de la fonction lors de la compil il a fait un appel stdart et pouf t'as l'air con)
 
Tu peux me dire qu'en est il dans d'autre compilo ? Y'a des compilos fournis avec un linker suffisament couillu pour faire l'inlining ? (ca me paraitrait surprenant quand meme)
 
Sous VC, inline est utilisé comme indicateur "hey celle la ca serait bien que tu me l'inline". Rien n'oblige le compilo a inline (il fait un calcul cout/gain qu'on peu fait sauter avec __forceinline)
 
 


Message édité par chrisbk le 27-10-2003 à 09:09:57
Reply

Marsh Posté le 27-10-2003 à 09:09:13    

chrisbk a écrit :

Bah la je vais parler pour VC6/2002 vu que c les compilos que j'ai le plus utilisé.
 
Si tu la joue comme ca et que tu balances l'implementation de ta fonction dans un fichier non accessible au travers du .h, tu va te manger une vilaine erreur de link (j'imagine que les inlines ne sont pas compilés et que comme le compilateur n'a pu trouver l'implem de la fonction lors de la compil il a fait un appel stdart et pouf t'as l'air con)
 
Tu peux me dire qu'en est il dans d'autre compilo ? Y'a des compilos fournis avec un linker suffisament couillu pour faire l'inlining ? (ca me paraitrait surprenant quand meme)


 
[:xx_xx]
Je veux bien croire que visual est une merde mais là je pense que c toi qui a fait une connerie...


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

Marsh Posté le 27-10-2003 à 09:11:12    

LetoII a écrit :


 
[:xx_xx]
Je veux bien croire que visual est une merde mais là je pense que c toi qui a fait une connerie...


 
paske toi tu peuxfaire ca :
 
toto.h
 

Code :
  1. class toto
  2. {
  3. inline void truc();
  4. }


 
toto.cpp

Code :
  1. void toto::truc()
  2. {
  3. ...
  4. }


 
 
roger.cpp

Code :
  1. #include "toto.h"
  2. ...
  3. machin.truc();


 
?

Reply

Marsh Posté le 27-10-2003 à 09:16:48    

chrisbk a écrit :


 
paske toi tu peuxfaire ca :
 
toto.h
 

Code :
  1. class toto
  2. {
  3. inline void truc();
  4. }


 
toto.cpp

Code :
  1. void toto::truc()
  2. {
  3. ...
  4. }


 
 
roger.cpp

Code :
  1. #include "toto.h"
  2. ...
  3. machin.truc();


 
?


 
Bien sûr que non, désolé j'avais mal lu ta réponse, mais ça te permet de mettre la définition de la méthode en dehors de la définition de la classe, ce qui peut améliorer la lisibilité.


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

Marsh Posté le 27-10-2003 à 09:19:48    

LetoII a écrit :


 
Bien sûr que non, désolé j'avais mal lu ta réponse, mais ça te permet de mettre la définition de la méthode en dehors de la définition de la classe, ce qui peut améliorer la lisibilité.


 
bien sur que, bien sur que, ca serait pas mal de pouvoir le faire quand meme [:ddr555]
 
bon ben on est d'accord en fait ? :O On va boire un coup pour feter ca ? :D
 

Reply

Marsh Posté le 27-10-2003 à 09:19:48   

Reply

Marsh Posté le 27-10-2003 à 09:24:40    

chrisbk a écrit :


 
bien sur que, bien sur que, ca serait pas mal de pouvoir le faire quand meme [:ddr555]
 
 
 
bon ben on est d'accord en fait ? :O On va boire un coup pour feter ca ? :D
 
 


 
[:meganne] Sans alcool pour moi :D
 


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

Marsh Posté le 27-10-2003 à 09:27:25    

p-e peux-tu spécialiser ton template aussi
 
(si je fais pas d'erreur de syntaxe :)
 

Code :
  1. template <class Elem>
  2.   class my_class{
  3.      Elem* position;
  4.      Elem* color;
  5.     public:
  6.      my_class(Elem*, Elem*);
  7.      template <GLbyte>
  8.      void membre(GLbyte* v);
  9.      template <GLfloat>
  10.      void membre(GLfloat* v);
  11.   };
  12.  
  13.   template <class Elem>
  14.   my_class<Elem>::my_class(Elem* p, Elem* c){
  15.      position=p;
  16.             color=c;
  17.      //appel fonction
  18.   }
  19.   template <GLbyte>
  20.   void my_class<GLbyte>::membre(GLbyte* v) {
  21.      FonctionPourGLbyte(v);
  22.   }
  23.   template <GLfloat>
  24.   void my_class<GLfloat>::membre(GLfloat* v) {
  25.      FonctionPourGLfloat(v);
  26.   }


 
dites moi si j'ai fait une boulette ?


Message édité par blackgoddess le 27-10-2003 à 09:28:19

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 27-10-2003 à 09:33:43    

BlackGoddess a écrit :

p-e peux-tu spécialiser ton template aussi
 
(si je fais pas d'erreur de syntaxe :)
 

Code :
  1. template <class Elem>
  2.   class my_class{
  3.      Elem* position;
  4.      Elem* color;
  5.     public:
  6.      my_class(Elem*, Elem*);
  7.      template <GLbyte>
  8.      void membre(GLbyte* v);
  9.      template <GLfloat>
  10.      void membre(GLfloat* v);
  11.   };
  12.  
  13.   template <class Elem>
  14.   my_class<Elem>::my_class(Elem* p, Elem* c){
  15.      position=p;
  16.             color=c;
  17.      //appel fonction
  18.   }
  19.   template <GLbyte>
  20.   void my_class<GLbyte>::membre(GLbyte* v) {
  21.      FonctionPourGLbyte(v);
  22.   }
  23.   template <GLfloat>
  24.   void my_class<GLfloat>::membre(GLfloat* v) {
  25.      FonctionPourGLfloat(v);
  26.   }


 
dites moi si j'ai fait une boulette ?


 
Y a quelques petites erreurs:
 

Code :
  1. template <class Elem>
  2.     class my_class{
  3.          Elem* position;
  4.          Elem* color;
  5.         public:
  6.          my_class(Elem*, Elem*);
  7.    
  8.        
  9.          void membre(Elem* v);
  10.    
  11.        
  12.     };
  13.    
  14.     template <class Elem>
  15.     my_class<Elem>::my_class(Elem* p, Elem* c){
  16.          position=p;
  17.                 color=c;
  18.          //appel fonction
  19.     }
  20.  
  21.         void my_class<GLbyte>::membre(GLbyte* v) {
  22.          FonctionPourGLbyte(v);
  23.     }
  24.  
  25.         void my_class<GLfloat>::membre(GLfloat* v) {
  26.          FonctionPourGLfloat(v);
  27.     }


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

Marsh Posté le 27-10-2003 à 11:04:36    

mci pour la corection :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 27-10-2003 à 15:34:24    

(...je viens de rentrer...)
 
Merci à tous pour vos réponses!  
Je m'édite dessus.  
 

chrisbk a écrit :

ca depend :O
 
1/ C'est pas mal, pense bien a tout mettre dans le .h pour que le compilo inline tout ca
2/ D'un point de vu perf les fonction glColor3f et consorts sont ce qui se fait de pire :D mais c ptet pas ton soucis du moment
 


 
Je vais effectivement les taper en inline, c'est un bon conseil. Je préfère retaper "inline" devant chaqunes d'elles même si j'utilise pour l'instant VC6; au pire dans l'immédiat se sera redondant mais bon, y se peut que je change de compilateur d'ici peu donc je préfère être sûr.
 
2/J'avoue que dans l'immédiat ce n'est pas mon premier soucis mais ce le sera sans doute d'ici peu; cette fonction est desoptimisée par rapport aux autres glcolor3x ou elles le sont toutes au même titre?  
Que me conseils tu?


Message édité par peak le 27-10-2003 à 15:35:41
Reply

Marsh Posté le 27-10-2003 à 15:36:45    

Peak a écrit :

2/J'avoue que dans l'immédiat ce n'est pas mon premier soucis mais se le sera sans doute d'ici peu; cette fonction est desoptimisé par rapport aux autres glcolor3x ou elles le sont toutes au même titre?  
Que me conseils tu?


 
desoptimisé en tout  
Ca te fais un appel de fonction par composante de point (plus les conversions si tu utilises des floats alors que la carte veut des entier)
 
Je te conseillerais de regarder les drawGlElement drawArray (ou dans le gout, OGL ca fait un bail....)
Avant de regarder ca regarde bien avant si tes glVertexMachin ne remplissent quand meme pas le but que tu t'etais assigné, pas la peine de se faire mal pour rien

Reply

Marsh Posté le 27-10-2003 à 18:53:13    

ok, merci du conseil.
 :jap:

Reply

Sujets relatifs:

Leave a Replay

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