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

C++ Discussion :

Prototype fonction lambda


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 7
    Par défaut Prototype fonction lambda
    Bonjour,

    J'aimerais connaitre le prototype d'une fonction lambda sans utiliser auto.
    Le but est de pouvoir passer la fonction lambda en paramètre d'une fonction.

    Ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void (*toto)(Socket &sock) = [](Socket &sock) {}
    mais ce qui m'intéresse ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void (*toto)(Socket &sock) = [this](Socket &sock) {}
    Ça fonctionne pas, j'ai une erreur au niveau du crochet ouvrant.

    Est-ce que quelqu'un peut m'aider s'il vous plaît ?

  2. #2
    Membre Expert

    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
    Par défaut
    Le type d'une lambda n'est pas standardisé, c'est à la liberté du compilateur.

    Utilise un template ou std::function.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<class F>
    void foo(F&& f)
    { /*stuff*/ }
     
    //Utilisation
    foo([](){});

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Bonne réponse de Flob, pour ma part j'aurais uniquement conseillé std::function ici, car je pense que ce n'est pas utile de templater un code s'il ne rend pas un service supplémentaire par rapport à la version non templatée.

  4. #4
    Membre Expert

    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
    Par défaut
    On ne sait pas exactement ce que fait l'OP d'où la réponse le plus large possible. Mais j'ai pour règle de ne pas affaiblir le typage si ce n'est pas nécessaire, ce que permet de faire le template. Il peut cependant être dans un cas qui nécessite l'utilisation de std::function, typiquement stocker un foncteur où le passer à une fonction virtuelle (je vois pas d'autre cas, mais il y en a peut-être).

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 7
    Par défaut
    Merci pour vos réponse, mais je n'arrive pas à faire coller ces solutions sur le pattern que je veux utiliser.
    Ce que je voudrais faire:

    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
     
     
    class Truc
    {
    public:
      void add(TypeLambda func)
      {
          _list.push_back(func);
      }
     
    private:
    std::list<TypeLambda> _list;
    };
     
     
     
    class Other
    {
    public:
      Other(void)
      {
         Truc  machin;
     
         machin.add([this] (int toto) {
             // Do things
         });
      }
    };
    Je ne peux pas templater la class entière parce que je serais quand même obligé de connaitre le type pour la déclarer.
    Est-ce que quelqu'un a une solution ?

  6. #6
    Membre Expert

    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
    Par défaut
    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
     
    #include<functional>
    #include<list>
    #include<utility>
     
    class Truc
    {
    public:
      template<class F>
      void add(F&& func)
      { _list.push_back(std::forward<F>(func)); }
     
    private:
      std::list<std::function<void(int)>> _list;
    };
     
    class Other
    {
    public:
      Other(void)
      {
         Truc  machin;
     
         machin.add([this] (int toto) {
             // Do things
         });
      }
    };

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Bonne réponse de Flob, pour ma part j'aurais uniquement conseillé std::function ici, car je pense que ce n'est pas utile de templater un code s'il ne rend pas un service supplémentaire par rapport à la version non templatée.
    Ce n'est pas forcément une bonne idée... Le code templaté sera optimisé, et la lambda probablement inlinée. Un code avec une std::function ne le sera pas a priori, ce qui pourra conduire à des ralentissements très significatifs (après, ça dépend de l'usage de la lambda dans la fonction).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. [C++11] Templates variadiques et fonctions lambdas
    Par Steph_ng8 dans le forum Langage
    Réponses: 2
    Dernier message: 06/10/2011, 18h10
  2. les fonction lambda
    Par yan dans le forum Langage
    Réponses: 18
    Dernier message: 28/02/2011, 17h02
  3. [Prototype] Héritage fonction Format monétaire
    Par tavarlindar dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 08/06/2008, 11h31
  4. [debutant] prototype fonction
    Par richard dans le forum C
    Réponses: 2
    Dernier message: 20/02/2006, 23h40
  5. Réponses: 6
    Dernier message: 20/11/2005, 02h53

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