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 :

Creation d'un std::function


Sujet :

Langage C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Points : 106
    Points
    106
    Par défaut Creation d'un std::function
    Bonjour,

    J'aurais aime savoir pourquoi nous n'avons pas a notre disposition une fonction std::make_function a l'effigie de std::make_shared, std::make_pair ou encore std::make_tuple (pas sur pour ce dernier).

    Merci d'avance!

  2. #2
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Bonjour,
    Je ne sais pas précisément ce que vous voulez faire, mais je pence que std::bind devrais répondre a vos besoin. (ou les expressions lambda)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Points : 106
    Points
    106
    Par défaut
    Imaginons le code suivante :

    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
    30
    #include <functional>
    #include <iostream>
     
    template<typename Res, typename... Args>
    void foo(const std::function<Res(Args...)> &f)   { /* Some code */ }
     
    struct A
    {
        void bar() {}
    };
     
    int main()
    {
     
        //foo( []() {std::cout << std::endl;} );
     
        std::function<void()> f = []() {std::cout << std::endl;};
        foo( f );
     
     
     
     
        A a;
        //foo( std::bind(&A::bar, &a) );
     
        std::function<void()> g = std::bind(&A::bar, &a);
        foo(g);
     
        return 0;
    }
    Les deux commentaires provoquent une erreur de compil, alors qu'en passant par des fonctions temporaire pas de soucis en utilisant les même mécanisme (lambda et std::bind).

    Je ne vais pas grappiller sur çà c'est surtout une question de reflexion!

  4. #4
    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 : 34
    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
    Bonsoir,

    Prenons le problème sous un autre angle :
    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
     
     
    #include<iostream>
    #include<functional>
     
    struct Func
    {
    	void operator()(int) const
    	{ std::cout << 0; }
    	void operator()(int,int) const
    	{ std::cout << 1; }
    };
     
    int main()
    {
    	std::function<void(int)> f1 = Func();
    	std::function<void(int,int)> f2 = Func();
    	f1(0); f2(0,0);
    };
    Ce code fonctionne parfaitement, maintenant imagines qu'il existe une fonction tel que tu le proposes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<class F>
    std::functor</*déterminer par F*/>
    make_functor(F f) { /*code*/ }
     
    //avec le code précédent
    auto f = make_functor(Func());
    Quel va être le type déterminé par auto ? std::function<void(int)> ou std::function<void(int,int)> ?

    Cependant on pourrait le faire en partant d'un pointeur de fonction, c'est un peu ce que fait bind (ca retourne une classe du genre BindHelper, qui est un foncteur dont les paramètres de l'opérateur () sont déterminé pas le pointeur de fonction).

    Pour les lambdas, le type est spécifique et je ne connais pas assez ces spécificités pour en dire plus. Et si on utilisait les lambda de boost le problème est tout autre : ils sont polymorphiques, ainsi les types sont non déterminé.

    Pour ton problème, il faut que tu fasses comme pour les algorithmes de la bibliothèque standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<class F>
    void foo(F f) { /*code*/ }
     
    template<class F>
    void foo(F&& f) { /*code*/ }
    Le but de std/boost::function c'est de proposer un wrapper pour la notion de foncteur, ce n'est pas les foncteur en eux-même, un foncteur étant n'importe quelle classe proposant un opérateur (). L'utilité de std/boost::function est ainsi de pouvoir récupérer ces différents types foncteurs et de les traiter de manière identique (typiquement : les stocker).

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Points : 106
    Points
    106
    Par défaut
    D'accord je vais m'orienter de ce côté là. Par contre tu peux me dire la différence entre ces deux fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<class F>
    void foo(F f) { /*code*/ }
     
    template<class F>
    void foo(F&& f) { /*code*/ }
    Merci beaucoup!

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Le premier utilisera une copie du paramètre, le second un déplacement. Si le callable est trivial, une copie devrait suffire. Si des ressources couteuses sont utilisées, alors le déplacement devrait être préférable.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Points : 106
    Points
    106
    Par défaut
    Merci!

    P.S. Sur le post suivant on traite des rref et std::forward pour ceux intéressés. http://www.developpez.net/forums/d11...e/#post6326012

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

Discussions similaires

  1. Utilisation de std::function pour créer un bouton
    Par Invité dans le forum SL & STL
    Réponses: 19
    Dernier message: 28/09/2014, 18h12
  2. Variadic templates et std::function
    Par white_tentacle dans le forum C++
    Réponses: 36
    Dernier message: 08/07/2014, 11h38
  3. Réponses: 2
    Dernier message: 15/05/2013, 16h13
  4. [C++11] std::function, fonctions membres et héritage
    Par Assouan dans le forum Langage
    Réponses: 9
    Dernier message: 05/03/2013, 19h53
  5. [std::function] fonction .target<Type>()
    Par Nadd dans le forum C++
    Réponses: 2
    Dernier message: 04/04/2012, 23h59

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