Je dois faire fonctionner ces fonctions dans la syntaxe "normale". comment puis-je le changer? En fait, j'ai besoin de changer la fonction "for_each" qu'elle utilisera en dehors de la classe. Je ne sais pas comment le faire. pouvez-vous aider?comment se débarrasser de la syntaxe lambda
Répondre
Une fonction lambda est une fermeture de type, implémentée en tant que foncteur sans nom.
Vous pouvez consulter ces mots clés pour comprendre comment effectuer une "conversion". Quasiment la règle serait que cette lambda:
[capture_clause](args) -> return_type { /* lambda_body */ }
est pratiquement (dans une vue simplifiée - lambdas générique ou valeur/ref captures ne sont pas explicitement montré ici) ce
struct no_name
{
no_name(capture_clause) : /* Initialize the closure */ { }
return_type operator()(args) { /* lambda_body */ }
};
Dans votre cas, vous auriez à faire une classe comme suit:
template <template <class, class> class Container>
struct lamda_fun
{
Container<Course*, std::allocator<Course*> > &newone;
lamda_fun(Container<Course*, std::allocator<Course*> > &newone)
: newone(newone) {
}
void operator()(Course *c) {
Course* nc = new Course(c->getName(),c->getNumber(), c->getFaculty());
newone.push_back(nc);
}
};
Si vous voulez toujours vous débarrasser de la syntaxe lambda appeler comme
std::for_each(courses.begin(), courses.end(), lamda_fun<Container>(newone));
Même si une copie du foncteur sera transmis à for_each
, le foncteur enveloppe une référence sera donc fait la bonne chose.
Une façon plus facile serait de simplement utiliser une boucle for
bien (oui ceux qui existent encore)
// range based version
for (auto c : courses) {
Course* nc = new Course(c->getName(), c->getNumber(), c->getFaculty());
newone.push_back(nc);
}
// traditional version
for (auto it = courses.begin(), ite = courses.end(); it != ite; ++it)
{
auto c = *it;
Course* nc = new Course(c->getName(), c->getNumber(), c->getFaculty());
newone.push_back(nc);
}
merci, mais comment puis-je changer la fonction que j'ai posté? – user144555
@ user144555 En faisant * exactement * ce que dit cette réponse: créez un foncteur qui implémente 'operator()' correctement, puis passez une instance de ce foncteur à votre algorithme. (+1, btw). – WhozCraig
merci! Je ne sais pas pourquoi, mais le compilateur dit que quelque chose ne va pas avec la défenition du container ("Container n'est pas un template"). Comment je le répare? – user144555
Vous pouvez remplacer le lambda avec une classe locale:
#include <algorithm>
#include <iostream>
#include <vector>
template <class Container>
Container transform(const Container& container) {
struct Lambda {
Container& result;
Lambda(Container& result) : result(result) {}
void operator() (const typename Container::value_type& value) {
result.push_back(value + 1);
}
};
Container result;
std::for_each(container.begin(), container.end(), Lambda(result));
return result;
}
int main() {
std::vector<int> u;
u.push_back(0);
u.push_back(1);
u.push_back(2);
std::vector<int> v = transform(u);
std::cout << v[0] << v[1] << v[2] << '\n';
}
- 1. Se débarrasser de l'erreur de syntaxe "==" dans android
- 2. Comment se débarrasser de la typographie?
- 3. Comment se débarrasser de EXC_BAD_ACCESS
- 4. Comment se débarrasser de TypeError
- 5. Comment se débarrasser de document.write?
- 6. Comment se débarrasser de xmlns = ""?
- 7. Override avec la syntaxe lambda
- 8. regex php: "se débarrasser [link1] se débarrasser [link2] ... se débarrasser" - problème 'se débarrasser' quand il n'y a pas [link]
- 9. comment retirer de la liste en utilisant la syntaxe Lambda
- 10. Comment se débarrasser des marges
- 11. Comment se débarrasser des pointeurs?
- 12. RelayCommand problème de syntaxe lambda
- 13. se débarrasser de nbsp
- 14. se débarrasser de la sortie de fin
- 15. Comment se débarrasser des points!
- 16. Erreur dans la syntaxe d'expression lambda
- 17. besoin de se débarrasser de se concentrer
- 18. se débarrasser de la cession sans contrôle
- 19. Comment se débarrasser de la fenêtre de la console
- 20. Comment se débarrasser de l'exception de sécurité?
- 21. Se débarrasser de la Figure 1: bit
- 22. se débarrasser de la fin de l'URL
- 23. Se débarrasser de l'argument de la fonction
- 24. se débarrasser de la barre de défilement
- 25. Comment se débarrasser de l'ancienne Localizable.strings?
- 26. Pourquoi et comment se débarrasser de NullReferenceException
- 27. Comment se débarrasser de funcall en commun Lisp
- 28. Comment se débarrasser de ce goto?
- 29. Comment se débarrasser de en utilisant php
- 30. Comment se débarrasser des étiquettes de ligne?
Vous pourriez il suffit de faire du lambda un foncteur exactement comme le standard le définit de toute façon dans [expr.prim.lambda]. – chris
Avez-vous essayé de le faire? Comprenez-vous comment fonctionne la version actuelle du code? – Ilya
Je ne vous comprends pas vraiment. Je ne sais pas comment ce coude fonctionne donc je serais heureux d'avoir une explication. mais mon professeur m'a demandé de changer ce code de toute façon à une syntaxe normale. – user144555