IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Variadic template et pointeur sur fonction


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 24
    Points : 22
    Points
    22
    Par défaut Variadic template et pointeur sur fonction
    Bonjour, ou bonsoir à tous, merci de vous attarder sur mon modeste message

    Voila, je voudrais créer une fonction utilisant les template variadiques (parce que je le vaut bien, et que ça me fait bosser) prenant un pointeur sur une fonction en argument, plus les arguments de la fonction en question.

    Dans mon exemple (j'ai utilisé un namespace pour pouvoir avoir une utilisation ultérieure) j'ai la fonction chrono, qui renvoie un std::pair<int, typederetour> qui contient le temps d’exécution et la valeur de retour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    //chronoF.h
    namespace chronoFonct{
        template<typename Ret, typename... Arg>
        std::pair<int, Ret> chrono(Ret(*fonct)(Arg...), Arg...); // = std::pair<temps, type de retour> chrono(fonction, arguments)
    }
    //chronoF.cpp
    #include "chronoF.h"
     
    namespace chronoFonct{
        template<typename Ret, typename... Arg>
        std::pair<int, Ret> chrono(Ret(*fonct)(Arg...), Arg... arguments){
              //...
        }
    }
     
    //main.cpp
     
    #include "chronoF.h"
     
    int boucle(bool, char, int){
        for(int i = 0; i < 1000; ++i);
        return 1;
    }
     
    int main(){
        std::pair<int, int> a = chronoFonct::chrono(boucle, true, 'a', 1);
        return 0;
    }
    Hors, il y a un os... Voici l'insulte de mon compilo

    undefined reference to `std::pair<int, int> chronoFonct::chrono<int, bool, char, int>(int (*)(bool, char, int), bool, char, int)'
    voila, je compille avec l'option -std=c++11, et avec mingw

    Si vous savez pourquoi cette erreur, vous serez gentil de m'aider...

    Merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    les templates doivent être entièrement définis dans des headers et inclus, et jamais dans des fichiers compilés.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Note au passage que tu pourrais faire plus générique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template<class F, class... Arg>
      std::pair<size_t,typename std::result_of<F(Arg...)>::type>
      chrono(F&& f, Arg&&... arg)
    {
      //...
      //puis lors de l'appel à f
      using std::forward;
      f(forward<Arg>(arg)...);
      //...
    }
    (non testé, mais c'est l'idée)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    @Flob90 ah ? je comprend pas grand chose à ton code ^^' tu pourrais me l'expliquer s'il te plais ?

    En tout cas, merci à tous !

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    L'idée principale est de passer la fonction également en paramètre template. Il utilise en plus le perfect forwarding pour le passage de paramètre (les rvalue refs) (je dois avoir un article encours sur cette technique... un jour peut être il sera publié)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    Salut ! Merci pour une réponse aussi rapide !

    Je vais me renseigner sur le sujet du perfect forwarding car ça me parait être ma foi un mécanisme fort intéressant ^^

    Merci à vous. Je posterai un autre sujet si j'ai des questions.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 24
    Dernier message: 21/06/2013, 03h45
  2. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  3. pointeurs sur fonction en C++
    Par cemoi dans le forum C++
    Réponses: 7
    Dernier message: 29/11/2004, 13h19
  4. [langage] Pointeur sur fonction
    Par Fanch.g dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2004, 10h43
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo