En C ++ 11, existe-t-il un moyen de modèle d'une fonction lambda? Ou est-il intrinsèquement trop spécifique pour être modelé?
Je comprends que je peux plutôt définir une classe / un foncteur de modèles classique, mais la question est plus comme: le langage autorise-t-il les modèles de fonctions lambda?
Réponses:
MISE À JOUR 2018: C ++ 20 viendra avec des lambdas modèles et conceptualisés. La fonctionnalité a déjà été intégrée dans le projet standard.
MISE À JOUR 2014: C ++ 14 est sorti cette année et fournit maintenant aux lambdas polymorphes la même syntaxe que dans cet exemple. Certains grands compilateurs l'implémentent déjà.
À l'heure actuelle (en C ++ 11), malheureusement non. Les lambdas polymorphes seraient excellents en termes de flexibilité et de puissance.
La raison originale pour laquelle ils ont fini par être monomorphes était à cause des concepts. Les concepts ont rendu cette situation de code difficile:
Dans un modèle contraint, vous ne pouvez appeler que d'autres modèles contraints. (Sinon, les contraintes ne pourraient pas être vérifiées.) Peut être
foo
invoquébar(x)
? Quelles contraintes le lambda a-t-il (le paramètre n'est-il qu'un modèle, après tout)?Les concepts n'étaient pas prêts à s'attaquer à ce genre de choses; cela nécessiterait plus de choses comme
late_check
(où le concept n'a pas été vérifié jusqu'à ce qu'il soit invoqué) et d'autres choses. Le plus simple était de tout laisser tomber et de s'en tenir aux lambdas monomorphes.Cependant, avec la suppression des concepts de C ++ 0x, les lambdas polymorphes redeviennent une proposition simple. Cependant, je ne trouve aucune proposition à ce sujet. :(
la source
Les lambdas C ++ 11 ne peuvent pas être modélisés comme indiqué dans d'autres réponses, mais
decltype()
semblent aider lors de l'utilisation d'un lambda dans une classe ou une fonction modélisée.Tirages:
J'ai trouvé que cette technique est utile lorsque vous travaillez avec du code basé sur des modèles, mais réalisez qu'elle signifie toujours que les lambdas eux-mêmes ne peuvent pas être basés sur des modèles.
la source
T
fonctionnerait bien à la place dedecltype(t)
dans cet exemple.En C ++ 11, les fonctions lambda ne peuvent pas être modélisées, mais dans la prochaine version de la norme ISO C ++ (souvent appelée C ++ 14), cette fonctionnalité sera introduite. [La source]
Exemple d'utilisation:
Notez que bien que la syntaxe utilise le mot clé
auto
, la déduction de type n'utilisera pas les règles deauto
déduction de type, mais utilisera plutôt les règles de déduction d'argument de modèle. Voir également la proposition d'expressions lambda génériques (et la mise à jour de celle-ci).la source
auto
déduction de type sont spécifiquement définies pour être les mêmes que celles de latemplate
déduction d'argument de fonction.Je suis conscient que cette question concerne C ++ 11. Cependant, pour ceux qui ont googlé et ont atterri sur cette page, les lambdas basés sur des modèles sont désormais pris en charge en C ++ 14 et portent le nom de Lambdas génériques.
[info] La plupart des compilateurs populaires prennent désormais en charge cette fonctionnalité. Prise en charge de Microsoft Visual Studio 2015. Clang prend en charge. GCC prend en charge.
la source
Je me demande ce qu'il en est:
J'ai utilisé un code similaire comme celui-ci, pour générer un modèle et je me demande si le compilateur optimisera la fonction "wrapping".
la source
Jetez un œil à Boost.Phoenix pour les lambdas polymorphes: http://www.boost.org/doc/libs/1_44_0/libs/spirit/phoenix/doc/html/index.html Ne nécessite pas C ++ 0x, par le façon :)
la source
Il existe une extension gcc qui autorise les modèles lambda :
où
_widgets
est unstd::tuple< fusion::pair<Key_T, Widget_T>... >
la source
J'ai joué avec la dernière
version 5.0.1
compilation de clang avec le-std=c++17
drapeau et il y a maintenant un bon support pour les paramètres de type automatique pour les lambdas:la source
Voici une solution qui consiste à envelopper le lamba dans une structure:
Pour utiliser do:
Le principal problème avec cela (en plus de la saisie supplémentaire), vous ne pouvez pas intégrer cette définition de structure dans une autre méthode ou vous obtenez (gcc 4.9)
J'ai aussi essayé de faire ça:
Avec l'espoir de pouvoir l'utiliser comme ceci:
Mais j'obtiens l'erreur du compilateur:
Donc, cela ne fonctionne pas ... mais même s'il compilait, cela serait d'une utilité limitée car nous aurions encore à mettre le "using LamdaT" à la portée du fichier (car c'est un modèle) qui défait en quelque sorte le but de lambdas.
la source
Je ne sais pas pourquoi personne d'autre ne l'a suggéré, mais vous pouvez écrire une fonction de modèle qui renvoie des fonctions lambda. Ce qui suit a résolu mon problème, la raison pour laquelle je suis venu sur cette page:
Maintenant, chaque fois que je veux une fonction qui prend un type d'argument donné (par exemple
std::string
), je dis simplementet
f("any string")
revient maintenant1.0
.Voilà un exemple de ce que je veux dire par «fonction lambda basée sur des modèles». (Ce cas particulier est utilisé pour fournir automatiquement une fonction de pondération inerte lorsque quelqu'un ne veut pas pondérer ses données, quelles que soient leurs données.)
la source