|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : novembre 2005 Messages : 4 970 ![]() |
Tu as le problème avec toute expression. Les lambda, c'est juste un moyen d'avoir une expression de type fonction. Si maintenant tu définis une nouvelle fonction dés que tu as une expression plus complexe qu'un appel de fonction, je comprends ton point de vue sur les lambda, sinon, je trouve que tu manques de suite dans les idées.
__________________
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça. |
|
|
10
|
|
|
#22 |
![]() ![]() |
Attention, comprenons nous quand meme
Je ne suis absolument pas opposé au lambda, je dis juste que nous avons maintenant un nouvel outil qu'il nous appartient d'apprendre à utiliser "à bon escient". Les lambda sont finalement comme tout le reste, allant de la récurisivité à l'héritage : c'est une possibilité qui nous est donnée, mais il faut faire la part de ce que l'on peut faire parce que le langage nous l'autorise et de ce qu'il est opportun de faire dans une situation donnée. Le langage nous permettrait (car il n'est pas armé pour nous l'interdire De la même manière, les lambda sont certes très intéressantes, mais je me méfie au plus haut point de la seule raison "je voudrais faire moderne". Comme toute nouvelle fonctionnalité, il va très certainement falloir un "temps de prise en main", et c'est normal, mais je ne serais pas étonné outre mesure que d'ici peu, on voie "fleurir" les "règles de bonnes conduites" à leur sujet, comme "ne peuvent être utilisées que dans telles ou telles circonstances", et on aura raison d'édicter ces "règles de bonnes conduites". Je serais très embêté le jour où je verrais une expression lambda recopiée encore et encore parce que l'on trouvera que les lambda "c'est moderne", alors qu'un foncteur aurait pu faire la même chose Je t'accorde volontiers que ce n'est pas un problème propre au lamba, et je l'ai signalé dés le début de mes interventions, mais je tente juste d'attirer l'attention de tous en disant "utilisez les si c'est utile, mais surtout s'il est cohérent de les utiliser" Je ne vois donc absolument pas en quoi je manque de suite dans les idées en faisant une mise en garde que l'on a déjà fait à de nombreuses reprises, bien que sur des sujets différents
__________________
en bas de page
|
|
|
10
|
|
|
#23 |
![]() ![]() Loïc JolyDéveloppeur informatique Inscription : août 2004 Messages : 4 679 ![]() |
En fait, je pense que l'effet de mode principal qui va apparaître n'est pas tant "on utilise des lambdas partout", mais plutôt "on peut rendre le code customisable partout, parce que grâce aux lambdas, ça devient utilisable".
Par exemple, à l'ancienne mode, si j'ai une classe qui contient un certains nombre de sous objets, mais dont la manipulation n'a pas à être très riche, en plus d'un insert et d'un delete, j'aurais exposé un begin et un end. Maintenant, il y a plus de chances que j'expose uniquement un for_each.
__________________
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11. |
|
|
00
|
|
|
#24 | |
![]() ![]() Loïc JolyDéveloppeur informatique Inscription : août 2004 Messages : 4 679 ![]() |
Citation:
Et bien entendu, cette fonctionnalité supplémentaire a un coût en performances.
__________________
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11. |
|
|
|
00
|
|
|
#25 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : novembre 2005 Messages : 4 970 ![]() |
Citation:
__________________
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça. |
|
|
|
00
|
|
|
#26 | ||||||||
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 673 ![]() |
Bonsoir,
je déterre ce sujet car ma question est à peu de chose près la même, avec juste une petite complication supplémentaire. Prenons le code suivant. Nous avons une structure bête, appelons-là Param, définie comme suit: Code :
Code :
Code :
Code :
Mais maintenant, je voudrais remplacer mon foncteur FilterByName par une fonction lambda. Est-ce possible? Si oui comment? |
||||||||
|
|
00
|
|
|
#27 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 318 ![]() |
Bonjour
* ce que tu veux faire, c'est un remove_copy_if, non ? * c'est quoi ce swap moche pour faire un clear ? * souvent, pour des questions de généricité (pour pas cher), on utilise des iterateurs et non un conteneur directement * par similarité avec les algo de la STL, c'est préférable de passer tous les iterateurs puis le filtre à la fin (cela permet de s'y retrouver plus facilement entre les versions des algo avec et sans prédicat personnalisés) EDIT : pour le lambda : ta fonction dois capturer params[0], dois prendre 1 paramètre Param const& (cf la définition de ApplyFilter) et retourne un bool : 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
|
|
|
#28 | |||
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 673 ![]() |
Citation:
pourquoi est-ce moche? Citation:
Citation:
Sinon, j'avais résolu mon problème entre temps, et je suis tombé exactement sur le même code que toi ![]() souvent, coucher sur papier un problème aide grandement à le résoudre |
|||
|
|
00
|
|
|
#29 | ||
![]() ![]() Germino LegrandDéveloppeur de jeux vidéo Inscription : octobre 2010 Messages : 371 ![]() |
Aïe gbdivers, ta lambda est un monstre
. Je développe plus en détail dans Pourquoi la capture aveugle est-elle dangereuse ?, mais là tu copies un vector complet sans que ça te choque ![]() Code :
*germinolegrand commence à être fatigué de recopier ce qui est marqué dans son article tous les 3 topics *
__________________
|
||
|
00
|
|
|
#30 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 318 ![]() |
Parce qu'un clear sert à effacer et un swap à échanger. En utilisant du code qui ne fait pas explicitement ce qu'il dit qu'il fait, ça peut être source d'erreur (ok, très faible dans ce cas là) D'autant plus que je doute ici de l'intérêt
Citation:
Conteneur ou itérateur ? C'est par habitude de la STL. Mais peut être qu'il faudrait revoir l'habitude (en prenant exemple sur range based for ?)
__________________
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
|
|
|
#31 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 318 ![]() |
@germinoland
Oui, je fais le barbare avec la capture de tout ce qui traîne... et oui, j'ai des doutes quand à l'utilisation de [=] (déjà parlé de ce problème)... et oui, utiliser la copie ici est moisi Sinon, rien me choque moi
__________________
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
|
|
|
#32 | ||
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 673 ![]() |
Citation:
Citation:
Telle est, effectivement, la question existentielle... En fait, j'ai en tête l'exemple de la fonction generate(), dont la logique ne me plait pas trop car il faut connaitre la taille du conteneur généré avant l'appel (ou utiliser un back_inserter_iterator ou une étrangeté dans le genre, et je n'aime pas très beaucoup trop ça). Du coup je pencherais plutôt vers la templatization du conteneur, mais sans vraiment y avoir réfléchi plus avant. |
||
|
|
00
|
|
|
#33 | |||||||||
|
Membre Expert
![]() ![]() Inscription : mai 2008 Messages : 937 ![]() |
Citation:
Code :
vector< Param >().swap( result ); // clear result Code :
Autre chose, perso je pense que je ne passerais pas le vecteur filter_param par référence, autant le renvoyer directement comme valeur de retour de la fonction ApplyFilter. Ca simplifie pas mal le code et les perfs seront identiques de toute façon : Code :
Citation:
Code :
Pour le coup de la capture [=] en effet on copie inutilement tout le vecteur params juste pour pouvoir récuperer params[0].name ce n'est pas terrible. ![]() Dans l'exemple présenté il n'y a clairement pas de problème de durée de vie donc on peut simplement prendre par référence : Code :
ApplyFilter(params, [&] (Param const& p) { return p.name == params[0].name; }, filtered_params ); Code :
ApplyFilter(params, [¶ms] (Param const& p) { return p.name == params[0].name; }, filtered_params ); Citation:
|
|||||||||
|
|
00
|
|
|
#34 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 318 ![]() |
@Arzar
Pour le back_inserter et le [=], effectivement. Pour le range based for, c'est une question de lisibilité et d'habitude. J'aime bien quand même les algos, qui ont un nom explicite (on va relancer la discussion "faut il bannir for du C++ ?" )Pour le template, il y a ceux concernant les itérateurs, qu'il faut de toute façon utiliser. Toi, tu parles du template pour le prédicat. On peut effectivement utiliser une std::fonction, et dans ce cas les paramètres de la fonctions sont explicites, alors qu'avec un template pour le prédicat, il faut indiquer la définition que doit prendre la fonction dans la doc. La première est plus explicite pour l'utilisateur, la seconde plus simple pour le dév
__________________
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
|
|
|
#35 | |
![]() ![]() Germino LegrandDéveloppeur de jeux vidéo Inscription : octobre 2010 Messages : 371 ![]() |
En cours de rédaction, mais j'ai l'impression que plus tôt il sera fini, plus je m'éviterai de copier-collé
(c'est la 3e fois en 2 jours que je fais du pur copier collé de son contenu xD)Citation:
Pour le clear qui ne remet pas la taille à zéro, shrink_to_fit juste après permet de bien remettre tout à zéro
__________________
|
|
|
00
|
|
|
#36 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 673 ![]() |
|
|
|
00
|
|
|
#37 |
![]() ![]() Germino LegrandDéveloppeur de jeux vidéo Inscription : octobre 2010 Messages : 371 ![]() |
oui. Même si c'est clairement du troll pur et simple tel que c'est posé, c'est une question qui mérite vraiment réflexion...
__________________
|
|
00
|
|
|
#38 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 318 ![]() |
Bien sur que non, personne n'oserait poser cette question sérieusement. Ou pas... Faut-il bannir le for du C++ ?
Au delà de l'aspect volontairement trollesque dans la rédaction de la question, il y a quand même des questions de fond intéressantes (et de nombreuses remarques et interrogations pertinentes). En particulier sur l'expressivité du code (ie utiliser des noms qui disent ce qu'ils font), ce qui rejoint les interrogations exprimées ici sur l'utilisation des lambdas et des range based for.
__________________
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
|
Copyright © 2000-2013 - www.developpez.com