|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 668 ![]() |
Bonjour,
Prenons par exemple le problème suivant: nous voulons remplir un tableau d'entier avec des nombres aléatoires compris entre 0 et un nombre donné. Prenons donc le code suivant qui fais ce qui est demandé: Code :
|
||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() ![]() Inscription : mai 2008 Messages : 937 ![]() |
Bonsoir,
Comme ça : Code :
|
||
|
|
10
|
|
|
#3 | ||
![]() ![]() Loïc JolyDéveloppeur informatique Inscription : août 2004 Messages : 4 675 ![]() |
Il manque la gestion du max :
Code :
__________________
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11. |
||
|
|
10
|
|
|
#4 | ||
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 318 ![]() |
En terme de bonne pratique d'écriture, il vaut mieux indiquer explicitement les variables capturées ou pas ?
Code :
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5. |
||
|
00
|
|
|
#5 | ||
|
Membre chevronné
![]() ![]() Inscription : décembre 2008 Messages : 490 ![]() |
Il y a aussi la possibilité d'un code un poil plus lisible :
Code :
|
||
|
|
00
|
|
|
#6 | |||
![]() ![]() Loïc JolyDéveloppeur informatique Inscription : août 2004 Messages : 4 675 ![]() |
Citation:
Je ne suis pas convaincu que la lisibilité en soit tant améliorée. Et comme la durée de vie de la lambda est prolongée, si jamais il y a capture par référence, je préfère la première version...
__________________
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11. |
|||
|
|
00
|
|
|
#7 | |||
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 668 ![]() |
Citation:
|
|||
|
|
00
|
|
|
#8 |
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 318 ![]() |
Même correction que pour le code d'Arzar si tu as besoin de mettre mod en paramètre, il suffit de l'ajouter dans la liste de capture
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5. |
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 668 ![]() |
Ok. Merci à tous.
|
|
|
00
|
|
|
#10 | |||
|
Membre chevronné
![]() ![]() Inscription : décembre 2008 Messages : 490 ![]() |
Citation:
A la rigueur, on peut se demander ce qui se passerait si la fonction retournait une copie de RandGenerator (possible?) mais autrement... Je suis le seul à trouver indigestes ces lambdas anonymes utilisées en "rvalue" ? Admettons, il nous faut étoffer la lambda : Code :
En plus un objet RandGenerator aurait l'avantage «d'auto-commenter» l’objectif de la lambda. |
|||
|
|
00
|
|
|
#11 |
|
Expert Confirmé
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 202 ![]() |
Parce que justement, les lambda sont faites pour les microscopiques bouts de codes, pas pour une grande fonction.
Pour ca, on a une fonctionnalité extremement ancienne: les fonctions.
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
|
00
|
|
|
#12 |
![]() ![]() |
Salut,
Je ne vais pas proposer de réponse au problème de base, mais je voudrais quand même émettre (en fait, répéter, car je l'ai déjà émis dans une autre discussion De manière générale, je ne suis déjà pas certain qu'il soit vraiment intéressant de vouloir refaire quelque chose qui fonctionne et qui reste malgré tout conceptuellement correct simplement pour "faire moderne". Autant je suis convaincu de l'utilité de remplacer un pointeur de fonction par un foncteur, autant je reste plus que mitigé quand à l'idée de remplacer un foncteur par une lambda expression Concernant les lambda en elles-même, mon ressenti (plus que personnel, mais que je partage
Si, pour faire moderne, tu commences à placer des lambda partout, tu risque fort de te retrouver très facilement dans une situation dans laquelle tu te retrouveras à avoir trois, quatre ou N fois exactement la même lambda à des endroits différent du code. Si, pour une raison ou une autre, tu en viens à devoir la modifier, il est fort probable que tu doives le faire à ces N endroits, avec un risque d'autant plus accru d'en oublier un que N sera important Pour le deuxième cas, cela ne me pose pas vraiment de problème, tant qu'il est clairement entendu qu'un POC est un code jetable, qui devra de toutes manières être réécrit une fois que l'on a la preuve de la faisabilité de la chose. Encore faut il que cette règle du "code jetable" soit respectée , mais ca, c'est une politique à mettre en place au niveau du projet De manière générale, je crois personnellement que les lambda sont une bonne chose, tant que l'on n'oublie pas que c'est comme pour tout le reste: il ne suffit pas de se dire qu' "on peut les utiliser" pour qu'il soit opportun de les utiliser, et il ne faut certainement pas se contenter de la seule raison de "faire moderne" pour décider de le faire
__________________
en bas de page
|
|
|
00
|
|
|
#13 |
|
Membre chevronné
![]() ![]() Inscription : décembre 2008 Messages : 490 ![]() |
Pour moi l'intérêt des lambda est de proposer une alternative au fait de polluer l'API d'une classe (ou une entête de fonctions) par la définition d'un foncteur d'une utilité très spécifique du genre supprimerLesVoyelles. Ça ne veut pas forcément dire que la lambda tient sur une ligne (surtout si on se limite à 80 colonnes de code).
|
|
|
00
|
|
|
#14 | ||
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 318 ![]() |
Quelle idée de vouloir mettre les foncteurs dans l'API aussi
A priori, la place d'un foncteur est dans un .cpp ou, s'il est utilisé plusieurs fois, dans son propre .h. Donc pas de raison qu'il pollue une API. Concernant l'utilisation des lambdas nommées et les lambdas de plusieurs lignes, j'ai des doutes aussi. Pour rappel, le C++11 permet d'utiliser des types locaux dans des templates, donc il faut comparer : Code :
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5. |
||
|
10
|
|
|
#15 |
|
Expert Confirmé
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 202 ![]() |
Un bon lambda, à mon humble avis, ne devrait faire qu'une instruction, voire deux.
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
|
00
|
|
|
#16 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 668 ![]() |
Je découvre quasiment les lambdas (je faisait essentiellement du c# depuis que le dernier standard a commencé à être implémenté dans les compilateurs), et à première vue, j'ai l'impression que ça peut tout de même résoudre un problème que j'avais régulièrement, qui peut se résumer en une question: "où est-ce que je met mes foncteurs?".
Etant un utilisateur acharné de <algorithm> (je commence à me repentir mais c'est une autre histoire), je me retrouvais vite avec de nombreux foncteurs qui polluaient mes zolis en-têtes. Donc oui, dans le cas d'une opération très simple (comme par l'exemple du premier message), je trouve que les lambdas résolvent un problème existant. Il reste également une piste à regarder: les lambdas, les foncteurs, les pointeurs de fonction, et stl::function (anciennement boost:function) sont interchangeables. Au moins dans les paramètres de fonctions. Peut-être cette propriété ouvre-t-elle de nouveaux horizons? |
|
|
00
|
|
|
#17 |
|
Membre chevronné
![]() ![]() Inscription : décembre 2008 Messages : 490 ![]() |
C'est vrai, je reconnais. C'est d'ailleurs ce que j'avais l'habitude de faire en C++03 : des fonctions static au début de mon .cpp. Reste que dans une logique de "déclarez aussi localement que possible" je trouve les lambda plus abouties.
|
|
|
00
|
|
|
#18 | ||||
|
Expert Confirmé
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 202 ![]() |
Le pointeur de fonction est une source de variabilité.
Code :
Code :
Pour ce que j'en vois, std::function permet surtout de prendre un lambda en argument.
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
||||
|
00
|
|
|
#19 |
![]() ![]() |
En fait, moi, ce qui me gène dans les lambdas, c'est leur "non réutilisabilité", ou, si vous préférez, le fait de devoir en copier le code si, d'aventure, nous avons besoin de la même fonctionnalité à différents endroits
![]() Je ne suis pas contre le principe lorsqu'il s'agit d'implémenter un besoin bien spécifique, dans une fonction qui l'est tout autant, mais ce qui m'inquiète au plus haut point, c'est le risque d'utilisation abusive simplement "parce qu'on peut le faire", tout comme je serai toujours opposé au fait d'utiliser la récursivité là où une simple boucle ferait tout aussi bien l'affaire. C'est pour cela que je parlais de deux cas qui, AMHA, peuvent justifier l'utilisation des lambda, tout en me réservant, il est vrai, le droit d'en rajouter au fur et à mesure de l'expérience que j'ai des lambda. Mais, dans l'absolu, je considère qu'il ne faut pas les utiliser uniquement "pour faire moderne" ou "parce qu'on peut le faire"
__________________
en bas de page
|
|
|
00
|
|
|
#20 |
![]() ![]() Loïc JolyDéveloppeur informatique Inscription : août 2004 Messages : 4 675 ![]() |
Je pense que le problème de la répétition est un faux problème. Enfin, disons surtout que ce n'est pas un problème lié aux lambdas.
Il y a du code réutilisable, et il y a du code qui ne l'est pas. Il y a du code à exécution directe, et du code à exécution déportée. Et les 4 combinaisons de ces deux critères ont de l'intérêt, mais sans les lambdas, on manque d'outils pour une des combinaisons (non réutilisable et déporté). Imaginons une boucle for, si son contenu est réutilisable, on en fait une fonction, sinon on met directement le contenu dans la boucle. Imaginons maintenant un parallel_for, si son contenu est réutilisable, on en fait un foncteur nommé, sinon, on en fait une lambda. Après, certains vont ne pas bien respecter le critère réutilisabilité, ou ne pas être d'accord sur la frontière, mais les lambdas n'introduisent pas un nouveau problème, juste une déclinaison d'un problème ancien.
__________________
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11. |
|
|
20
|
Copyright © 2000-2013 - www.developpez.com