Partage
  • Partager sur Facebook
  • Partager sur Twitter

Une std::map de pointeurs de fonctions

Problème au niveau du template

Sujet résolu
    6 mars 2008 à 17:43:34

    Bonjour à tous :)

    Alors, je voudrais créer une std::map dont les clés seraient des chaînes de caractères (std::string) et dont les contenus seraient des fonctions. Le problème est que je n'ai pas la syntaxe, je ne sais pas comment déclarer le "type" pointeur de fonction. J'ai essayé ceci, naïvement :

    1. std::map<std::string str, void(*fonction)(VM*)> opcodes;
    2. // Où VM est une classe, mais peu importe le type


    Mais, bien entendu, on ne peut pas nommer les paramètres de cette façon. Après diverses expériences et en regardant bien les messages du compilateur, j'en suis arrivé à celà :

    1. std::map<std::string, void(VM*)> opcodes;


    Mais le compilateur me balance une erreur quand j'essaie d'affecter une fonction :

    1. void foo(VM* vm)
    2. {
    3. }
    4. // ...
    5. {
    6.     opcodes["foo"] = foo;
    7. }


    Il me dit que j'éssaie d'écrire dans un endroit accessible en lecture seule, ou alors une erreur de type (parfois les deux).

    J'ai cherché un peu partout sur le web, mais je n'ai pas trouvé de posts dans les forums ou sur la faq de developpez.com qui évoque de problème. J'ai bien entendu parler des foncteurs, mais ils ne sont pas vraiment adaptés à mon cas (ça donnerait du code trop lourd).

    A toutes fins utiles, je travaille sous GNU/Linux (x86_64) avec G++ et ma std::map en question devra être un membre statique d'une classe.

    Merci de m'indiquer la syntaxe à utiliser, et bonne soirée :)
    • Partager sur Facebook
    • Partager sur Twitter
    J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
      6 mars 2008 à 17:46:28

      Je crois que c'est void (VM::*)(void) mais je suis pas sûr.
      En tout cas ça ne marchera surement qu'avec les fonctions statiques.
      EDIT: qu'est-ce que je peux dire comme conneries parfois...
      • Partager sur Facebook
      • Partager sur Twitter
        6 mars 2008 à 17:51:18

        En fait, les fonctions que contiendra cette map sont de "vraies" fonctions, pas des méthodes. Donc c'est un peu comme si la map était une variable globale (oui, c'est mal, pataper). Et la map ne sera PAS un membre de la classe VM, mais d'une autre classe.

        Je vais essayer ce que tu proposes.

        EDIT : Il me donne une erreur de type

        no matches converting function 'foo' to type 'void (class VM::*)()'


        Avec les insultes habituelles.
        • Partager sur Facebook
        • Partager sur Twitter
        J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
          6 mars 2008 à 17:54:16

          1. void f()
          2. {
          3.     std::cout << "Hello World!" <<  std::endl;
          4. }
          5. int main()
          6. {
          7.     std::map< std::string, void(*)(void) > dict;
          8.     dict[ "f" ] = f;
          9.     (*dict[ "f" ])();
          10.     return 0;
          11. }
          • Partager sur Facebook
          • Partager sur Twitter
            6 mars 2008 à 17:58:27

            Yes MatteX, c'est exactement ce qu'il me fallait.

            Merci beaucoup à vous deux.
            • Partager sur Facebook
            • Partager sur Twitter
            J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
              7 mars 2008 à 18:13:53

              Tu devrais passer à boost::function au fait, plutôt que ça. Ca sera beaucoup plus souple.
              • Partager sur Facebook
              • Partager sur Twitter
                7 mars 2008 à 19:19:18

                OK, je vais essayer quand j'aurai codé le reste du projet. Ça a l'air bien. Merci du conseil.
                • Partager sur Facebook
                • Partager sur Twitter
                J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.

                Une std::map de pointeurs de fonctions

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown