Partage
  • Partager sur Facebook
  • Partager sur Twitter

Réaliser une fonction executant une autrre fonction

quel que soit son nombre d'arguments et leur type

    14 juin 2008 à 22:36:04

    Bonjour tout le monde ! :)

    Je voudrais réaliser une fonction (ou une classe) qui serait capable d'exécuter n'importe quel type de fonction (retournant un void), quel que soit son nombre d'arguments et leur type. :-°

    Par exemple, on pourrait tout aussi bien faire :
    exec(fonction1(8, "coucou"));
    

    que :
    exec(fonction2(string("coucou"), 13.5, 9));
    

    ... la fonction exec() s'adaptant a toute sorte de fonction. ^^

    J'aimerais donc que quelqu'un m'explique un peu comment réaliser ce projet (que je pense réalisable puisque c'est ce que fait Qt dans sa fonction connect()). :D

    Merci d'avance. :)
    • Partager sur Facebook
    • Partager sur Twitter
      14 juin 2008 à 22:44:34

      non pas vraiment tu as un ordre avec connect et s'il manque un paramètre ça plante.

      bool connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoCompatConnection )
      • Partager sur Facebook
      • Partager sur Twitter
      :)
        14 juin 2008 à 22:49:18

        Je m'en moque un peu en fait de ce que fait connect(), moi je veux juste faire ma fonction ! :p Mais merci quand même pour l'info ;)

        J'ai fait quelques recherches quand même, et j'ai trouvé qu'il faut que je me débrouille avec des foncteurs et des pointeurs de fonction ! ^^

        Maintenant, il faut que je trouve comment ... :D
        • Partager sur Facebook
        • Partager sur Twitter
          14 juin 2008 à 22:51:36

          Même si je ne vois pas l'utilité de ce genre de chose si ce n'est que s'embrouiller à la relecture du code (mais quoi va avec quoi) bref je ne peux pas t'aider. Car je pensais ça impossible lol.
          Bonne chance ;)
          • Partager sur Facebook
          • Partager sur Twitter
          :)
          Anonyme
            14 juin 2008 à 22:52:11

            exec(fonction2(string("coucou"), 13.5, 9)); ne pourra jamis faire ce que tu veux. Tu pourrais (mais je n'en suis pas sur) arrivé a exec(fonction2,string("coucou"), 13.5, 9)
            une idée de declaration serai
            template<class T> void exec(T fonction...);
            
            • Partager sur Facebook
            • Partager sur Twitter
              15 juin 2008 à 4:40:33

              boost::function ?
              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                15 juin 2008 à 6:26:20

                Pour être un peu plus précis, ça donnerait un truc de ce genre :
                void exec(boost::function<void ()> Func)
                {
                    Func();
                }
                
                exec(boost::bind(function1, 8, "coucou"));
                exec(boost::bind(function2, "coucou", 13.5, 9));
                
                • Partager sur Facebook
                • Partager sur Twitter
                  15 juin 2008 à 9:38:48

                  Et comment est ce qu'ils font les gens de Boost pour faire ça (Je parle de façon pédagogique lol) ? (A titre informatif)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 juin 2008 à 9:59:25

                    Si tu veux te faire peur tu peux toujours regarder ça directement dans les sources.

                    En gros, c'est des kilomètres de classes templates et de surcharges pour gérer tous les nombres et types de paramètres possibles. Quelques macros imbuvables permettent de rendre le code plus court et moins lisible.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      15 juin 2008 à 10:07:57

                      au fait, quel est l'intérêt de cette fonction?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 juin 2008 à 11:58:49

                        Bien que cela fait différemment, /Modern C++ Design/ d'Andrei Alexandrescu a un chapitre entier consacré à expliquer comment on implémente des foncteurs avancés (ce que sont boost::function).
                        Mais bon, cela demande déjà une certaine connaissance du langage.

                        Et ..+1 à la question de youyou.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                          15 juin 2008 à 14:29:33

                          Etant donnée la façon dont a été exposée la question, je plussoie aussi pour la question de youyou.

                          Le chapitre de Modern C++ Design dont lmghs parle fait pas mal réfléchir à ce genre de choses, bien que le livre entier soit une bible des (bonnes) bases de la programmation générique. J'ai d'ailleurs écrit un article à propos de choses absolument nécessaires et vitales pour comprendre le code exposé dans Modern C++ Design.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Réaliser une fonction executant une autrre fonction

                          × 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