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 :

Fonctions anonymes (lambda)


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut Fonctions anonymes (lambda)
    Bonjour Tout le monde,

    Je voudrais savoir la différence entre une expression lambda et une fonction lambda.

    Quel est l'intérêt d'utiliser les fonctions lambda en C++?

    Pourquoi on les appelle anonymes?

    Si j'ai ce code qui est correct tel qu'il est écrit:

    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 <iostream>
     
    using namespace std;
     
    int main()
    {
       auto func=[] {cout << "hello" << endl; } ;
        func();
     
        auto f= [] () -> void {
     
           cout << "hello";
        };
        f();
     
         auto f1= [] () -> double {
     
            double r;
            cout << "donner un reel" << endl;
            cin >> r;
     
            return r*r;
        };
        cout << f1() << endl;
        return 0;
    }
    pourquoi il faut mettre le mot clé auto devant le nom des fonctions anonymes/lambda?
    par exemple pour la fonction f1: le type de retour est double. Pourquoi en remplaçant auto par double, le programme génère une erreur?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    double f1= [] () -> double {
     
            cout << "donner un reel" << endl;
            double r;
            cin >> r;
     
            return r*r;
        };
    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Les fonctions anonymes/ lambda sont des fonctions qu'on a besoin juste pour 1 tâche spécifique : retour d'1 "thread", traitement à faire sur chaque élément d'1 collection, par exemple.
    C'est pour cela qu'elles sont anonymes, "sans nom" : on s'en fiche de cette fonction, on veut juste qu'elle fasse le travail.
    Et d'aileurs, elle est souvent passée directement en paramètre.

    Regarde la notion de fermeture : fermeture, lien wikipedia et sa version anglais + complète.

    Je ne connais pas bien cela en C++ , mais 1 fonction anonyme est 1 fonction.
    Donc le type doit être 1 type fonction. auto doit être là pour masquer 1 type "à la C++" complexe/ indigeste/ pas simple

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    On utilise auto pour déduire le type de la lambda parce que chaque lambda a un type différent qui correspond à son expression. Et comme ce type est unique et construit "sur place", le seul moyen de mettre la lambda dans une variable est d'utiliser auto pour déduire le type.

    par exemple pour la fonction f1: le type de retour est double. Pourquoi en remplaçant auto par double, le programme génère une erreur?
    Il y a confusion entre le type de retour d'un appel de la lambda et le type de la lambda.

  4. #4
    Membre actif
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    Bonjour,

    Tout d'abord merci pour votre aide.
    J'ai une autre question:

    Est ce que la variable f1 contient la valeur retournée (r*r) par la fonction lambda ou bien elle contient un objet dont le type est déduit automatiquement (c'est pourquoi dans l'exemple on utilise auto et non pas double)?

    merci d'avance

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par nadia85 Voir le message
    Est ce que la variable f1 contient la valeur retournée (r*r) par la fonction lambda ou bien elle contient un objet dont le type est déduit automatiquement (c'est pourquoi dans l'exemple on utilise auto et non pas double)?
    Comme déjà écrit, f1 c'est la lambda et son type est unique; quant à la valeur retournée elle n'existera qu'au moment où on va utiliser la lambda.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     auto f1 = []( double x ) -> double { return x * x; };
     auto f2 = []( double x ) -> double { return x * x; };
     static_assert( ! std::is_same_v<decltype(f1),decltype(f2)> ); // f1 et f2 font exactement la même chose MAIS N'ONT PAS LE MEME TYPE
     
     double  y = f1( 42 );   // là, la lambda s'exécute et retourne un résultat.

  6. #6
    Membre actif
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    Bonjour,

    Je vous remercie encore pour toutes ces explications.

    Pourquoi la lambda est anonyme alors qu'on lui a donné un nom (f1 par exemple?)?
    Est ce qu'on peut dire que les fonctions lambda sont des fonctions inline?

    Merci d'avance?

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

Discussions similaires

  1. [JS] Fonction anonyme et retour de variable ?
    Par lounislounis dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/07/2010, 00h23
  2. Fonctions anonymes et passage de variables
    Par Killua69 dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 23/07/2010, 12h16
  3. fonction membre depuis fonction anonyme
    Par PoZZyX dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/06/2010, 17h30
  4. Fonction dans une fonction anonyme
    Par Shinjuku dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/07/2009, 11h50
  5. fsolve & paramètres de la fonction anonyme
    Par Mathusalem dans le forum MATLAB
    Réponses: 1
    Dernier message: 05/07/2006, 10h04

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