web-dev-qa-db-fra.com

Lambda comme paramètre de fonction

Quelle est la notation pour déclarer une variable lambda ou un paramètre de fonction sans utiliser de auto ou de modèles? Existe-t-il un moyen de le faire? Ou le compilateur définit-il un objet de classe unique pour chaque lambda dont le nom est inconnu du programmeur avant l'heure de compilation? Si oui, pourquoi? Ne peuvent-ils pas simplement être passés comme une sorte de pointeur de fonction? Ce serait une grande déception si cela n'était pas possible.

59
slartibartfast

Les lambdas peuvent détenir un état (comme les références capturées du contexte environnant); s'ils ne le font pas, ils peuvent être stockés dans un pointeur de fonction. S'ils le font, ils doivent être stockés en tant qu'objet fonction (car il n'y a pas où conserver l'état dans un pointeur de fonction).

// No state, can be a function pointer:
int (*func_pointer) (int) = [](int a) { return a; };

// One with state:
int b = 3;
std::function<int (int)> func_obj = [&](int a) { return a*b; };
56
Todd Gardner

Vous pouvez utiliser un wrapper polymorphe pour un objet fonction . Par exemple:

#include <functional>

std::function<double (double, double)> f = [](double a, double b) { return a*b };
25
David Alber