8
votes

Plans de bibliothèque pour C ++ 0x?

Dernièrement, je suis très excité du soutien de Lambdas dans VC2010. Je commence lentement à saisir le potentiel complet de cette fonctionnalité de transformer C ++ en quelque chose de beaucoup mieux.

Mais puis j'ai réalisé que ce potentiel dépend fortement de la prise en charge du flux principal de Lambdas dans les bibliothèques quotidiennes, telles que 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?

Lambdas remplace pratiquement la nécessité de booster :: Lambda et tout dans le boost qui interagit avec elle. QT pourrait ajouter de la prise en charge de Lambdas dans tout leur conteneur et peut-être même comme une solution alternative de définition emplacement s


13 commentaires

Boost :: Lier Les cibles ne sont pas remplacées par Lambdas. std :: lid 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 tout type d'argument, tandis que [] (int & a) {A ++; } ne peut que l'incrémente int. int. J'ai entendu dire que les concepts sont hors de C ++, les lambdas polymorphes sont une option à nouveau.


@LitB - C'est intéressant, avez-vous des liens avec des matériaux expliquant pourquoi les concepts étaient un barrage routier vers Lambdas avec des paramètres de type?


Je ne connais pas d'un papier qui en discute en détail, mais je lis cela sur Usenet. J'imagine, il aurait dû être un moyen de dire que nécessite bla [] (t) {...} ou quelque chose comme ça pour rendre l'opérateur de Lambda () Modèle 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 à vérifier. Donc, avec une lambda ayant un opérateur modèles non étayé () , vous ne pouvez pas l'utiliser dans un modèle contraint comme celui-ci: Modèle VOID F (T T) {([ ] (u) {...}) (t); } .


Maintenant, avec des concepts partis, ces questions ne doivent plus être résolues.


Lambdas comme machines à sous sera une chose tellement merveilleuse un jour. Je ne me souviens pas combien de fois j'ai écrit une ligne de créneaux de ligne ou juste connectée à tester quelque chose ... Enregistrement de tout le travail d'écriture d'un emplacement "normal" serait une grande coupe courte.


Ah, je ne connaissais pas les concepts bloqués pour cela. On dirait que les coups de pied était la bonne façon d'aller (même s'il est probablement trop tard maintenant pour introduire des lambdas polymorphes)


@LITB - Alors, quel serait le cas d'utilisation pour introduire un nouveau paramètre de type au point de définir une Lambda? Pour moi, l'idée d'un Lambda est que vous les définissez au point d'utilisation (seulement). Je peux voir pourquoi (évidemment) que vous voudriez que Lambdas dépendent des paramètres de type de la classe environnante ou de la fonction, mais qui semble déjà fonctionner correctement (au moins dans MSVC ++ 2010 Beta 1). Mais si vous voulez définir quelque chose de réutilisable, vous devez lui donner un nom - et vous écrivez donc une classe qui surcharge l'opérateur () comme nous l'avons toujours fait.


En fait, je ne me suis même pas réalisé que vous pouviez écrire [] (u) {...} et que le compilateur découvre le type de u pour vous, afin que ce soit être où je me perds. Dans tous les cas, la solution de contournement est de mettre [] (t u) {...} est-ce vraiment un gros problème?


@Arwicker, eh bien si vous dites [] (u) {...} alors vous avez les mêmes messages d'erreur horribles et longs que vous avez aujourd'hui avec des modèles, car le compilateur ne sait rien de "u ". dans les modèles contraignés (ceux qui ont des clauses de configuration), vous auriez besoin d'un last_check {...} autour de la Lambda puis, pour dire le compilateur "Oh, ne pas taper Cette partie: c'est une fonction lambda que je ne connais pas le type de 'U' pour ". Bien entendu, cela suppose que la Lambda polymorphe est mise en œuvre à l'aide de l'opérateur modélisé () d'évidence () .


@Arwicker, eh bien le [] (u) {...} Syntaxe a été composé par moi, pour avoir une syntaxe pour les lambdas polymorphes. Je suppose qu'une autre syntaxe pourrait être [] (auto u) {...} ou quelque chose. Ou vous pouvez l'améliorer afin que vous puissiez dire que vous pouvez dire modèle [] (T u, t u) {...} et pourrait ainsi le contraindre à avoir deux paramètres du même type.


Voir cet article Usenet: groups.google.com/group/comp. .std.c ++ / Browse_thread / thread / ...


Je vois que c'est pourquoi je me suis confus :) Donc, en ce qui concerne ce qui pourrait être activé maintenant que des concepts sont sortis, sommes-nous essentiellement de parler de la commodité d'avoir une inférence de type sur les paramètres? En dehors de cela, je ne vois pas ce que l'avantage est, car tout le point d'une Lambda est que ce n'est pas réutilisable, il n'a donc pas besoin d'être paramétré. Si vous en avez besoin pour être réutilisable, vous lui donnez un nom, c'est-à-dire écrire une fonction ordinaire (ou une classe si elle a besoin d'état).


@Arwicker, bien j'y ai pensé de cette façon: u = [] (auto & p) {p = 0; }; int a; u (a); flotteur b; u (b); / * A et B sont zéro maintenant * / . Je ne sais pas si cela a du sens cependant.


5 Réponses :


3
votes

Il y a de fortes chances que de telles bibliothèques attendent qu'il y ait une prise en charge appropriée du compilateur pour les caractéristiques C ++ 0X pertinentes et ne dérange pas beaucoup avec elle jusqu'à ce que les compilateurs traditionnels le soutiennent. Ne tiens pas votre souffle.


0 commentaires

6
votes

lambdas s'intègre déjà très bien dans les bibliothèques existantes - n'importe où qu'une fonction accepte un objet de fonction d'un type donné par un paramètre de modèle.

C'est l'une des grandes choses à leur sujet - ils sont un exemple classique d'une fonctionnalité linguistique qui codifie la pratique existante dans une syntaxe Nifty.

Évidemment, la bibliothèque de Boost Lambda devient redondante, mais cela signifie qu'il ne nécessite aucune nouvelle fonctionnalité à y être ajoutée.


1 commentaires

Un commentaire du Downvoter pourrait être intéressant (mais encore une fois, cela pourrait ne pas).



4
votes

Je ne vois pas comment l'utilisation de Lambda dépend du soutien des bibliothèques. Lambdas élimine la nécessité de créer de nombreuses classes juste pour envelopper différents petits algorithmes et soigneusement adapté avec d'autres fonctionnalités de langue / bibliothèque ( std :: fonction vous vient à l'esprit). Partout où vous utilisiez un objet de fonction ou un pointeur de fonction, Lambdas peut également être utilisé.

Ajoutez principalement une autre alternative pour utiliser le code et les bibliothèques existants. La seule façon de voir pour les bibliothèques pour mieux soutenir Lambda utilise des approches de style fonctionnel.


0 commentaires

0
votes

La plupart des bibliothèques utilisent des pointeurs de fonction standard pour les rappels. C ++ 0x Lambdas peut être utilisé comme pointeurs de fonction. La plupart des bibliothèques ne devraient donc pas être modifiées. D'autres bibliothèques utilisent des modèles afin qu'ils puissent prendre tout objet appelable (par exemple std :: foreach n'aurait pas besoin d'être modifié).

La seule autre caractéristique C ++ 0X que je peux penser de ces bibliothèques pourraient passer à l'aide de énums . En outre, les bibliothèques peuvent commencer à utiliser les modèles extern pour réduire les temps de compilation.


4 commentaires

Les références de valeur r seront (ou devrait) avoir un impact important - beaucoup de bibliothèques ont des cours qui servent de wrappers autour des ressources coûteuses à construire et que l'ajout d'opérations de déplacement accélérera instantanément de nombreux programmes écrits avec de telles bibliothèques (ou faire des programmes corrects beaucoup plus lisibles).


Ah, oui, j'ai oublié des références de valeur R. Je suppose qu'ils seraient beaucoup utilisés dans des bibliothèques comme Boost, mais pas tant dans les bibliothèques axées sur l'application comme Qt. De plus, dans la plupart des cas, il ne casse pas l'interface, de sorte que vous n'aurez donc jamais à vous soucier d'eux (sauf les utiliser dans votre propre code).


Vous ne pouvez pas attribuer le résultat d'une expression lambda à un pointeur de fonction.


@sellibitze: Un ancien commentaire, je sais, mais maintenant, vous pouvez maintenant si la Lambda est apatride.