c++0x: la bonne façon de recevoir un lambda comme paramètre par référence
Quelle est la bonne façon de définir une fonction qui reçoit un int->int
lambda paramètre par référence?
void f(std::function< int(int) >& lambda);
ou
void f(auto& lambda);
Je ne suis pas sûr que la dernière forme est encore légal de la syntaxe.
Il existe d'autres moyens de définir un paramètre lambda?
- Pourquoi auriez-vous besoin de le lambda par référence? Voulez-vous dire
const&
?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas avoir un
auto
paramètre. En gros, vous avez deux options:Option n ° 1: Utiliser
std::function
comme vous l'avez montré.L'Option n ° 2: Utilisation d'un paramètre du modèle:
Option #2 peut, dans certains cas, être plus efficace, car il permet d'éviter un potentiel d'allocation de tas pour l'embarqué lambda fonction de l'objet, mais n'est possible que si
f
peut être placé dans un en-tête comme une fonction de modèle. Il peut également augmenter les temps de compilation et de je-cache empreinte, comme un modèle. Notez qu'il ne peut avoir aucun effet, comme si la fonction lambda objet est d'assez petite taille, elle peut être représentée en ligne dans lestd::function
objet.std::function
wrapper en premier)std::function
objet" est trompeuse. Les Lambdas sont toujours disponibles en ligne (le compilateur peut choisir de ne pas bien sûr).std::function
implémentations utilise généralement de petits objets optimisation pour éviter les allocations de tas. Si un lambda a un assez petit capture de la liste, il sera stocké dansstd::function
sans l'aide de l'échelle. Autres que que un lambda de la taille n'a pas vraiment de sens.&
dansvoid f(F & lambda)
?F
comme une référence const évite de copier le lambda de l'objet lors du passage en argumentJe voudrais utiliser
template
comme:De sortie:
Démo : http://www.ideone.com/EayVq
Je sais, ça fait 7 ans, mais voici une manière que personne d'autre ne mentionnées:
Sorties:
Pas besoin de modèles ou de std::function
std::function
cas), tandis que basées sur des modèles de version n'a pas cette limitation.