[Probleme] Pointeurs de fonction dans une map

Pointeurs de fonction dans une map [Probleme] - C++ - Programmation

Marsh Posté le 12-10-2005 à 23:18:03    

Salut à tous !
 
Voila, je voudrais associer une fonction à une chaine donnée, pour ce faire, j'utilise une map.
Voici mon code:

Code :
  1. // Pour l'association d'une fonction pour la gestion des attributs.
  2. map<const char*, void*> _assocFonctAttrib;
  3. _assocFonctAttrib["length"] = (void*)(string::length());
  4.             string s;
  5.             s.(_assocFonctAttrib["length"]);      // Appele la méthode length...


 
Ca semble bizarre hors du contexte, mais est ce que ça peut fonctionner ?
 
 
Merci à ceux qui répondront !

Reply

Marsh Posté le 12-10-2005 à 23:18:03   

Reply

Marsh Posté le 12-10-2005 à 23:23:47    

c'est de la daube. utilise std::string, et des objets, pas des void*. Ne caste pas de fonction membre en void*. Fais une recherche sur les pointeurs de fonctions membres ?

Reply

Marsh Posté le 12-10-2005 à 23:31:50    

Ok ! Merci ! Heeeuuu ... Tu peux être un peu plus clair sur les objets ? Je veux un truc générique... C'est ce que j'éspérais avec un void...
T'as pas un exemple de code STP ?...
Sinon, j'utilise le namespace std, pas besoin de std::string alors ?


Message édité par djar le 12-10-2005 à 23:38:57
Reply

Marsh Posté le 13-10-2005 à 14:41:36    

???

Reply

Marsh Posté le 13-10-2005 à 20:08:56    

Code :
  1. _assocFonctAttrib["length"] = (void*)(string::length());


???
 
tu veux associer une fonction. Ok pour une fonction. Disons du type de

Code :
  1. int toto(int a, bool b);


 
définissons son type pointeur :

Code :
  1. typedef int (*FPTR)(int, bool);


 
et une map string -> pointeur de fonction :

Code :
  1. std::map<std::string, FPTR> foo;
  2. foo["toto"] = &toto;
  3. foo["titi"] = &titi;
  4. ...
  5. int n = foo["toto"](3, true);


 

Reply

Marsh Posté le 13-10-2005 à 20:21:16    

je crains qu'il ne veuille patater des fonctions membres dans sa map, et tout et n'importe quoi comme fonction, sans proto specifique

Reply

Marsh Posté le 13-10-2005 à 20:41:48    

c'est techniquement possible à coups de void* et de cast hasardeux, mais bon là je ne lui expliquerais pas, il doit repenser son code.
 

Code :
  1. static int toto(int a, bool b);
  2. static void titi(int* p);
  3. static char tutu(double d);
  4. enum { TOTO, TITI, TUTU };
  5. template<int n>
  6. struct MapFunction {};
  7. template<>
  8. struct MapFunction<TOTO>
  9. {
  10.    typedef int (*fptr)(int, bool);
  11.    static const fptr s_ptrfun = &toto;
  12. }
  13. template<>
  14. struct MapFunction<TITI>
  15. {
  16.    typedef void (*fptr)(int*);
  17.    static const fptr s_ptrfun = &titi;
  18. }
  19. template<>
  20. struct MapFunction<TUTU>
  21. {
  22.    typedef char (*fptr)(double);
  23.    static const fptr s_ptrfun = &tutu;
  24. }
  25. // et comme ça pour chaque fonction, de toute façon t'es obliger de les
  26. // connaître à la compil, alors autant mettre ça dans un template
  27. // au lieu de
  28. _assocFonctAttrib["toto"] = &toto;
  29. _assocFonctAttrib["toto"](42, true);
  30. // tu fais
  31. MapFunction<TOTO>::s_prtfun(42, true);


 
PS : j'ai un doute, un pointeur de fonction static peut-il être utilisé comme constante entière littérale (pour le static const) ? Si non, alors ça compile pas mais de toute façon c'est crade :D

Reply

Marsh Posté le 13-10-2005 à 20:42:00    

Et oui chrisbk, c'est exactement ça ! Je suis un barbare... Mais est ce que patater n'importe quoi est-il possible ?

Reply

Marsh Posté le 13-10-2005 à 20:42:29    

On a posté en même temps ! Mille merci pour la réponse !!


Message édité par djar le 13-10-2005 à 20:44:48
Reply

Marsh Posté le 07-02-2014 à 15:54:43    


 
Utilise boost::bind djar.
 
http://fr.web.img2.acsta.net/medias/nmedia/18/35/91/26/18686482.jpg


Message édité par djar le 07-02-2014 à 15:56:44
Reply

Sujets relatifs:

Leave a Replay

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