Dernièrement, je suis très excité par le support de lambdas dans VC2010. Je commence lentement à saisir le plein potentiel de cette fonctionnalité en transformant C++ en quelque chose de mieux. Mais ensuite, j'ai réalisé que ce potentiel dépend grandement de la prise en charge du flux principal de lambdas dans les bibliothèques de jour en jour comme boost et QT.
Est-ce que quelqu'un sait s'il est prévu d'étendre ces bibliothèques avec les nouvelles fonctionnalités de C++ 0x? Les lambdas remplacent pratiquement le besoin de boost :: lambda et tout ce qui en boost interagit avec lui. QT pourrait ajouter le support de lambdas dans tous leurs conteneurs et peut-être même comme une alternative pour définir SLOT
sLa bibliothèque prévoit C++ 0x?
Répondre
Lambdas s'intègre déjà très bien dans les bibliothèques existantes - partout où une fonction accepte un objet fonction d'un type donné par un paramètre de modèle.
Ceci est l'une des grandes choses à leur sujet - ils sont un exemple classique d'une fonctionnalité de langage qui codifie la pratique existante dans une syntaxe astucieuse.
De toute évidence, la bibliothèque boost lambda devient redondante, mais cela signifie qu'aucune nouvelle fonctionnalité ne doit y être ajoutée.
Un commentaire du downvoter pourrait être intéressant (mais encore une fois, il pourrait ne pas). –
Heh, est-ce votre commentaire sur le vote à la baisse? : P – GManNickG
Les chances sont que de telles bibliothèques attendent jusqu'à ce que le compilateur prenne en charge les fonctionnalités C++ 0x appropriées, et ne pas trop s'en soucier tant que les compilateurs traditionnels ne l'ont pas soutenu. Ne retiens pas ton souffle.
Je ne vois pas comment l'utilisation de lambda dépend du support par les bibliothèques. Lambdas élimine le besoin de créer de nombreuses classes juste pour envelopper différents petits algorithmes et s'intégrer parfaitement avec d'autres fonctionnalités de langage/bibliothèque (std::function
vient à l'esprit). Partout où vous avez passé un objet fonction ou un pointeur de fonction, lambdas peut aussi être utilisé. Par conséquent, ils ajoutent principalement une autre alternative pour utiliser le code et les bibliothèques existants. La seule façon que je puisse voir pour que les bibliothèques supportent mieux lambda est d'utiliser des approches plus fonctionnelles.
La plupart des bibliothèques utilisent des pointeurs de fonction standard pour les rappels. C++ 0x lambdas peut être utilisé comme pointeur de fonction, donc la plupart des bibliothèques n'auraient pas besoin d'être modifiées. D'autres bibliothèques utilisent des modèles pour pouvoir prendre n'importe quel objet appelable (par exemple std::foreach
n'aurait pas besoin d'être modifié).
La seule autre fonctionnalité C++ 0x à laquelle je peux penser que les bibliothèques peuvent changer est l'utilisation de enums
fortement typé. En outre, les bibliothèques peuvent commencer à utiliser les modèles extern
pour réduire les temps de compilation.
Les références de valeur r auront (ou devraient) avoir un grand impact - beaucoup de bibliothèques ont des classes qui servent de wrappers autour de ressources qui sont chères à construire, et l'ajout d'opérations de déplacement accélérera instantanément de nombreux programmes écrits avec de telles bibliothèques (ou rendre les programmes corrects beaucoup plus lisibles). –
Ah, oui, j'ai oublié les références R-value. Je suppose qu'ils seraient beaucoup utilisés dans les bibliothèques comme Boost, mais pas tellement dans les bibliothèques orientées applications comme Qt.De plus, dans la plupart des cas, l'interface ne sera pas brisée, donc vous n'aurez plus jamais à vous soucier d'eux (sauf les utiliser dans votre propre code). – Zifre
Vous ne pouvez pas affecter le résultat d'une expression lambda à un pointeur de fonction. – sellibitze
Cela n'est PAS vrai, vous ne pouvez pas remplacer boost :: lambda avec C++ 0x lambda. Voir here pour certaines raisons (à propos de boost bind, mais je pense que la plupart des transferts)
Aussi, @daniel this pourrait vous aider à démarrer en utilisant les fonctions lambda/boost bind pour les slots. Cela rend ma vie incroyablement facile.
De plus, @litb de mes sources, lambdas ne vont pas être changé (argh)
merci beaucoup pour le lien cheez! –
en ce qui concerne le problème laid de fermeture sur une variable de boucle et d'avoir à faire une copie. Au lieu de cela, utilisez 'for_each' pour parcourir le' vecteur
'boost :: cibles bind' une autre chose de ne pas être remplacé par lambdas. 'std :: bind' fera son travail de fonctions de liaison. Au lieu de cela, lambdas remplacera partiellement la fonctionnalité dans 'boost :: lambda' (et son successeur, boost :: phoenix, afaik). Ce que lambdas ne peut actuellement pas faire est le polymorphisme de 'boost :: lambda'.La possibilité de créer des fonctions qui fonctionnent sur n'importe quel type d'argument: '_1 ++' incrémente n'importe quel type d'argument, alors que '[] (int & a) {a ++; } 'peut seulement incrémenter int. J'ai entendu maintenant que les concepts sont en C++, les lambdas polymorphes sont à nouveau une option. –
@litb - c'est intéressant, avez-vous des liens vers des documents expliquant pourquoi les concepts étaient un obstacle à lambdas avec des paramètres de type? –
Je ne connais pas un article qui en parle en détail, mais je l'ai lu sur usenet. J'imagine, il aurait dû y avoir un moyen de dire 'nécessite Blah [] (T t) {...}' ou quelque chose comme ça pour rendre le template 'operator()' de lambda contraint. Un autre problème pourrait être que dans un modèle contraint, vous ne pouvez appeler que d'autres modèles contraints pour permettre à une définition de modèle d'être vérifiée par type. Donc, avec un lambda ayant un simple opérateur non modélisé '()', vous ne pouvez pas l'utiliser dans un template contraint comme ceci: 'template void f (T t) {([] (u) {...}) (t); } '. –