A quel moment doit-on considérer l'environnement comme nécessaire (-> capture) au lieu de paramètres ? Comment détermine-t-on qui est qui et pour quelles raisons ? (je pense ne pas avoir très bien compris la capture en elle même (j'entends par là dans la décision qui mène à son usage. Par valeur ou par ref ou rien, mutable ou non, je pense être bon avec ces notions)).
Exemple simple :
std::vector<int> c { 1,2,3,4,5,6,7 };
int x = 5;
c.erase(std::remove_if(c.begin(), c.end(), [x](int n) { return n < x; } ), c.end());
Ici, x est capturé par valeur et non modifié (donc pas besoin de la spécification mutable), et std::remove_if prend comme troisième paramètre une fonction unaire. Jusque là, tout est clair. Mais si je me positionne dans un cas random (hors SL) tel que :
std::vector<int> v {1, 8, 3, 6};
int i(0);
// qqch ne provenant pas de la SL et faisant intervenir une lambda
Comment savoir/comprendre qui se doit d'être capturé et qui se doit d'être paramètre ?
Ksass`Peuk l'immortel y notait alors en 2014 utiliser les lambdas dans la majeure partie des cas pour des associations avec les algorithmes de la SL. Une autre question serait donc : Au vu de la norme actuelle C++, faut-il privilégier l'usage des lambdas avec la SL ?
Toutes les réponses sont bonnes à prendre, par avance, merci à tous pour vos précisions sur ces points
- Edité par MaximeB25 11 juillet 2019 à 6:38:40
Si ça n'explose pas, alors ce n'est pas intéressant.
A quel moment doit-on considérer l'environnement comme nécessaire (-> capture) au lieu de paramètres ?
En gros, quand tu as besoin d'une valeur, tu vas la capturer sauf si tu n'as pas trop le choix et en gros, c'est le type que tu dois obtenir pour la fonction qui est transmise à l'algo/la fonction qui la réclame. Par exemple, les valeurs des conteneurs qui sont passées à la lambda, tu ne peux pas simplement les capturer et ça n'aurait pas trop d'intérêt puisque c'est justement le rôle des algos de la SL de transmettre les valeurs en question à la lambda. Et pour :
MaximeB25 a écrit:
Mais si je me positionne dans un cas random (hors SL) tel que :
std::vector<int> v {1, 8, 3, 6};
int i(0);
// qqch ne provenant pas de la SL et faisant intervenir une lambda
Comment savoir/comprendre qui se doit d'être capturé et qui se doit d'être paramètre ?
Bah c'est la même chose. C'est la fonction en question qui te dire ce dont elle a besoin. Et si c'est toi qui écrit cette fonction, c'est au moment où tu rédiges la fonction en question que tu détermines ce dont tu as besoin pour faire le job en question.
MaximeB25 a écrit:
Ksass`Peuk l'immortel y notait alors en 2014 utiliser les lambdas dans la majeure partie des cas pour des associations avec les algorithmes de la SL. Une autre question serait donc : Au vu de la norme actuelle C++, faut-il privilégier l'usage des lambdas avec la SL ?
Putain 5 ans déjà. Aujourd'hui, je pense que j'aurais tendance à filer un nom à la lambda et utiliser ce nom.
std::vector<int> c { 1,2,3,4,5,6,7 };
int x = 5;
auto less_than_x = [x](int n) { return n < x; } ;
c.erase(std::remove_if(c.begin(), c.end(), less_than_x), c.end());
Avec une fonction qui produit le prédicat nécessaire
auto less_than(int x) {
return [x](int n) {
return n < x;
} ;
}
Là on voit bien qu'une fois la fonction less_than appelée, le x (paramètre) n'existe plus, puisqu'on en est sorti.
Et donc, l'objet fonctionnel qu'elle retourne doit noter quelque part la valeur du x, pour avoir la possibilité de faire la comparaison : au moment de le construire, il faut capturer la valeur de x pendant qu'on l'a sous la main.
- Edité par michelbillaud 11 juillet 2019 à 9:20:22
Ça se comporte bien ça en C++ ? Parce que dans les langages fonctionnels c'est effectivement comme ça qu'on fait généralement , mais en C++, j'ai jamais regardé ce que pondait le compilo en sortie.
A mon avis, le manager est là pour préparer, à partir des données stockées, le contexte dans lequel il faudra lancer le "handler". Les comparaisons au début du manager, je vois pas trop pourquoi c'est là. Et comme je suis nul en assembleur x86, j'ai pas envie de creuser.
- Edité par michelbillaud 11 juillet 2019 à 11:21:02
Lambda : capture vs paramètres. Quand, comment ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Si ça n'explose pas, alors ce n'est pas intéressant.
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Si ça n'explose pas, alors ce n'est pas intéressant.
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C