95 votes

Pourquoi ne puis-je pas créer un vecteur de lambda en C++11?

J'ai essayé de créer un vecteur de lambda, mais a échoué:

auto ignore = [&]() { return 10; };  //1
std::vector<decltype(ignore)> v;     //2
v.push_back([&]() { return 100; });  //3

Jusqu'à la ligne #2, il compile amende. Mais la ligne n ° 3 donne une erreur de compilation:

error: no matching function for call to 'std::vector<main()::<lambda()>>::push_back(main()::<lambda()>)'

Je ne veux pas d'un vecteur de pointeurs de fonction ou un vecteur d'objets de fonction. Toutefois, le vecteur de la fonction des objets qui encapsulent réel les expressions lambda, pourrait fonctionner pour moi. Est-ce possible?

146voto

Puppy Points 90818

Chaque lambda a un type différent - même si elles ont la même signature. Vous devez utiliser au moment de l'exécution de l'encapsulation des conteneurs tels que std::function si vous voulez faire quelque chose comme ça.

par exemple:

std::vector<std::function<int()>> functors;
functors.push_back([&] { return 100; });
functors.push_back([&] { return 10; });

Je ne veux pas d'un vecteur de pointeurs de fonction ou vecteur de fonction objets.

Eh bien, je voudrais un beau travail très bien payé une centaine d'homme de l'équipe de développeur pour développer tous mes rêves, mais ça ne va pas arriver. Oh, et j'aimerais aussi une très jolie femme qui peut cuisiner et nettoyer, car je ne peux vraiment pas.

42voto

Tous les lambda expressions ont un type différent, même si elles sont identiques, caractère par caractère. Vous êtes en poussant un lambda de type différent (parce que c'est une autre expression) dans le vecteur, et qui de toute évidence ne fonctionne pas.

Une solution est de faire un vecteur d' std::function<int()> à la place.

auto ignore = [&]() { return 10; };
std::vector<std::function<int()>> v;
v.push_back(ignore);
v.push_back([&]() { return 100; });

Sur une autre note, ce n'est pas une bonne idée d'utiliser [&] lorsque vous n'êtes pas tout capturer.

18voto

Luc Danton Points 21421

Tout ce que les autres ont dit est pertinent, il est encore possible de déclarer et d'utiliser un vecteur de lambda, même s'il n'est pas très utile:

auto lambda = [] { return 10; };
std::vector<decltype(lambda)> vector;
vector.push_back(lambda);

Ainsi, vous pouvez stocker n'importe quel nombre de lambdas en, tant que c'est un copier/déplacer des lambda!

16voto

MSN Points 30386

Si votre lambda est apatride, c'est à dire, [](...){...}, C++11, il permet de se dégrader en un pointeur de fonction. En théorie, une C++11 compatible compilateur serait en mesure de compiler ce:

auto ignore = []() { return 10; };  //1 note misssing & in []!
std::vector<int (*)()> v;     //2
v.push_back([]() { return 100; });  //3

4voto

Paul Points 4552

Chaque lambda est d'un type différent. Vous devez utiliser std::tuple au lieu de std::vector.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X