Les concepts c'est pour de la TMP, donc l'héritage ça n'a clairement rien à voir.
Des fois que t'ai pas vu y a des exemples pas mal ici: https://en.cppreference.com/w/cpp/language/constraints
Ça permettra d'ailleurs de rendre les messages d'erreurs de compilation quand on utilise la lib standard beaucoup plus clairs (pour tout ce qui est TMP)...
Le C++ qui je le rappel ce nomme C++ car par rapport au C traditionnel augmente ++ :
- l'arthrose
- la myopie sans même faire de toi un Indiana Jones capable de déchiffrer les hiéroglyphes
- les douleurs musculaires
- le Syndrome du canal carpien !!!
Cette parodie qui détourne un film sur Hitler est génial :
Je reste toujours surpris ces dernieres années de voir le C++ qui revient au gout du jour. En ayant fait pendant 25 ans je n'ai pourtant pu constater que son desinteret de la part des nouveaux devs.
Les nouveaux devs (dans ma boite en tout cas) ne voient que par M$ et C# (au point de l'imposer comme unique langage a tout le monde !).
Ils n'ont aucune culture informatique et ne voient que le C++ comme quelque chose de compliqué.
On est en train de reecrire des applis C++ existantes eprouvées en leur version C# (je n'ai toujours pas compris l'interet).
Du coup dans quels types d'applications le C++ moderne a t il sa place en 2019 ?
J'ai bien essayé de pousser encore et encore (pour les perfs, maitrise memoire etc) mais j'ai du jeter l'eponge pour na pas passer pour le refractaire au changement (sur nos applis API Web, c'est principalement JS +C#).
On ne fait plus d'applis client lourd donc le coté multiplatforme est porté principalement par des applis web (sous Windows car on a des layatolas M$ qui pensent, respirent, vivent M$ exclusivement).
ok MERCI.
effectivement, autant de domaines qu'on n'utilise pas ou pour lesquels on utilise des composants deja existants (ex : cpprestsdk).
On privilegie des briques existantes avant de recoder un serveur web maison etc.
On a des devs qui font principalement des applis de gestion CRUD (type webapi/mvc) en archi micro services et pas des logiciels necessitant un background technique plus important donc loin de ce genre de composants (plus des devs qui font du C# comme on programmait sous visual basic cad programmation pour les noobs).
Donc effectivement C++ est hors de portee pour eux; ils ne comprendraient meme pas les notions de base.
C# est un langage assez fin, dernièrement j'ai été surpris qu'un type avec autant d'expérience que moi me demande à quoi correspond le mot clef "in" que j'avais utilisé dans mon programme. Je lui explique qu'il s'agit de "const MyType& arg" et la je l'ai perdu... En fait n'ayant jamais touché C/C++ il était pas capable de comprendre le concept ^^ . J'ai des tas d'exemple comme ça, on forme les gens à l'arrache en leur faisant croire que tout est magique mais C# ne l'est pas et on se retrouve avec des personnes incapable de comprendre ce qu'il se passe dans la machine quand il font par exemple "mytring += otherstring" ou encore qu'un événement est une liste de pointeurs de fonction et que ça n'est pas magiquement supprimé par le GC.
Tout le problème vient du fait que les gens sont formés sur de la syntaxe (enfin le gros de la syntaxe les subtilités osef... sauf que ça fait toute la différence), et pas sur la technologie qui est .NET qui elle même nécessite d'explorer C/C++.
C# reste de loin mon langage préféré même si je trouve C++ cool, en ce moment je dev un pilote linux en C++ et une couche d'intérop .NetCore qui va avec du fun.
C# est un excellent langage qui sert de base pour tout un tas de trucs dans C++ 11+.
De plus personne ne fait de client lourd depuis bien 10 ans, trop chiant à déployer etc. Tout est fait en web et ce même quand ce n'est pas forcément adapté et je ne pense pas que MS ait quelque chose à voir la dedans ils ont d'excellentes techno client lourd.
C++ sera a un moment donné remplacé par Rust, Go ou un truc du genre, après la structuration de C++ n'aide pas non plus pas de modules etc. une vraie chiasse à ce niveau après bon ça reste compréhensible à l'époque fallait pouvoir embarquer les dev cobol, c etc. Donc je ne vais pas trop lui taper dessus pour ça et puis ça a été ajouté donc.
Le truc qui m'intéresse le plus à porter de C++ vers dotnet ce sont les templates variadrique, j'attend la sortie de .Net 5 pour me lancer dans des modifs du compilateur et faire une spec etc. pour implémenter cela sur .Net.
Ce genre de question n'a de sens que si tu penses en tant que boite/RH qui va engager des devs.
Mais dans l'absolu je te dirais absolument tout, pour la simple raison qu'un dev qui maîtrise C++ ne fait pas du C++ seulement parce que c'est "rapide" (j'ai toujours trouvé cet argument pour faire du C++ plutôt moisi) ou encore "léger" (pareil pour ça), mais parce que C++ est réellement un bon langage, avec une élégance et une philosophie que tu ne retrouveras pas ailleurs. Puis niveau frameworks y a de quoi faire (genre Qt).
J'ai personnellement essayé pas mal de langages, et y a rien à faire, pour rien au monde je ne changerais. Seul Rust m’intéresse a côté mais c'est pour des cas assez précis, ou encore des langages fonctionnels pour leur façon de fonctionner.
Le seul "soucis" de C++ (qui a mon sens est plus une qualité mais bon) est le temps qu'il faut pour le maîtriser un tant soit peu, étant énormément fournis en concepts/fonctionnalités, et la lib standard étant directement liée au langage, il y a beaucoup de choses à apprendre (par exemple rien que maîtriser <algorithm> ça prend beaucoup de temps).
Beaucoup de langages eux vont cacher les difficultés sous le tapis. Y a qu'a voir les garbage collectors présents dans tellement de langages, et c'est pourtant une abomination:
- ça ne simplifie rien du tout, car tout ce que l'on gagne pour que les objets "s'effacent" comme par magie on le perd ailleurs (ordre de destruction indéterminé à cause des références cycliques, mémoire inutile supplémentaire, dégradation des performances)
- ça ne fonctionne pas pour tout ce qui n'est pas été prévu à cet effet (handle de fichier, vram)
- ça répond à un besoin qui n'existe pas à mon sens, mais pour ça il faut connaître la RAII et les pointeurs intelligents par exemple...
On se retrouve ainsi avec de faux pointeurs partout dans Java ou encore C#, parce que "les pointeurs et l'allocation de mémoire ça fait peur".
Ou encore des fonctions virtuelles partout dans Java...
Enfin bref, que des abominations pour faire croire que les choses sont plus simples qu'ailleurs, alors qu'en fait on se rend bien vite compte que c'est tout sauf le cas.
Comme quoi?
Tu preches un convaincu puisque je viens du C/C++. C'est juste que malgré la "beauté du langage" (pour moi c'est de la branlette d'informaticien) etc comme tu le dis ben on est dans un monde ou il faut developper rapidement. Si je demande a un developpeur il pourra effectivement se faire plaisir en utilisant tel ou tel langage parce que ca lui plait (ce que j'ai fais pendant des années avec C++); en pratique on choisit ce qui est le plus efficace pour arriver a la cible et surtoutpour que ca puisse etre maintenu par le plus grand nombre.
Donc tout ce qui est specialisé ben on a tendance a eviter.
Et comme souvent dans les dernieres années ce n'est pas C++ qui s'en sort le mieux car ca rebute les nouveaux qui ne veulent pas s'emmerder.
Si ca prend du temps ou apprentissage long (et donc couteux) ben le choix est vite fait pour un manager ou un dev junior.
De nos jours dans ma boite, hormis les devs +40 ans personne ne veut developper en C++ (on est d'ailleurs regardé comme des extra terrestres; des has been) - meme pire que ca ils n'arrivent pas lire le code CPP pour la maintenance; quand on parle d'API pour eux ca veut dire exclusivement WEB API (la notion d'API/Librairie leur echappe completement).
Et il faut arreter avec QT. Faire des logiciels a usage professionnel avec QT coute une blinde en terme de licence et on se fait vite rentrer dans le lard par nos clients qui ne veulent que du mobile/web mais certainement pas de client lourd (on a arrete avec les framework MFC/silverlight/WPF depuis un moment car pareil, plus personne ne voulait travailler sur ces technos jugées has been -pas en phase avec les demandes du marché du travail - ou alors dans des niches tres limitées presentant ainsi peu d'interet).
Donc tout le monde suit comme des moutons le mouvement general. Je me suis accroché a ce langage C/C++ pendant 25 ans (tout en me formant sur les autres java/Csharp sans grande conviction) mais j'ai bien jeté l'eponge depuis 2 ans . Ainsi va le monde du developpement.
Oui, c'est pour ça que la question n'a de sens que si on se projette sur une boite qui cherche à recruter ou a des besoins spécifiques.
Un bon dev C++ ça coûte cher effectivement.
Maintenant je pense qu'il y a quand même une garantie, étant donné que pour être un bon dev C++ cela nécessite beaucoup plus d'investissement que dans de nombreux langages, il y a moins de risque de tomber sur quelqu'un qui ne connaît pas son métier (je pense notamment a cet article qui me fait penser qu'être programmeur de nos jours ça ne veut plus dire grand chose).
Mais je suis d'accord que pour faire des choses simples, ce n'est pas forcement la meilleur idée économiquement.
Maintenant, dire que personne ne veut dev en C++, ça me parait un peu abusé. Si tu veux vite bosser en entreprise avec peu d'investissement personnel, d'accord.
Mais les bons dev C++ sont beaucoup recherchés non? J'ai peut être du mal a me rendre compte car 90% de mon entourage dev fait du C++ en pro.
Et c'est dans pas mal de domaines: optimisation de réseaux électriques, radio, interfaces, jeux vidéo, robotique (avec du Qt pour les outils justement), cloud gaming...
Quand à Qt si le projet est open source la licence est gratuite non?
Si c'est pour faire des outils, même a usage pro, c'est pas forcement un problème.
En tout cas ça a l'air difficile de trouver des prix, mais à priori ils ont un truc flexible en fonction du revenu de la boite.
Et vu l'efficacité du framework ça peut valoir le coup...
Quand je parle de "beauté du langage", je parle surtout de l'efficacité.
Il y a des choses que je fais en C++ que je ne me verrais absolument pas faire ailleurs, notamment car la metaprog ça n'existe pas chez Java/C#...
Moi je suis vite passé au C# Après mes études. Justement parce que je trouve que c'est un bon langage, élégant etc... Bref en fait les mêmes arguments que toi mais pour C# au lieu de C++. Et durant mes études j'ai appris à programmer avec c++ , et j'ai du faire du c, du java et accessoirement on a également vu toute une floppée de languages "exotiques" (haskell, etc...).
Alors ça fait longtemps que j'ai plus fais de c++ et je m’intéresse pas trop aux nouveautés même si je suis l'actualité, mais quand je vois les examples de code rien que la synthaxe me fait peur et je la trouve pas élégante pour un sou.
Néanmoins ça m’intéresse d'avoir un avis de quelqu'un qui aime le c++ et donc en quoi le trouve-tu élégant, bon, etc... ?
J'essaie de me tenir vaguement au courant sur ce qui peut se faire comme langage mais le nouveau c++ ne m'a jamais attiré, seul Rust récemment a attiré mon attention et j'ai commencé à lire le bouquin, du coup je pense complètement laisser tomber le c++ (ou du moins l'espoir que j'avais de m'y (re)mettre). (Ça me fait penser à une vidéo que j'ai vue récemment sur un top top10 des "jeux de société qu'on aurait voulu aimé", je pense qui si c'était une vidéo sur les langages de programmation alors c++ arriverait en tête pour moi. J'aurais vraiment voulu l'aimer mais non j'y arrive pas)
Je vois pas en quoi ne pas savoir lire du code CPP est une tare, surtout si c'est pas le langage de programmation pro !(vous êtes passé c# d'après ce que j'ai compris)
Sinon je vois pas en quoi il faut absolument passer par le c/c++ (qui sont en fait 2 langages très différent faut le rappeler) pour comprendre les notions de mémoire etc... On peut très bien le faire en c# également, y'a pas forcément besoin de pointeurs et de leur syntaxe c++. Je trouve le discours condescendant envers les nouveaux dev qui ne font pas du c++ et qui du coup seraient automatiquement des "sous-développeurs" justement sous le seul prétextes qu'ils n'ont pas fait de c++.
Le truc que je remarque par contre, c'est vrai, bcp de devs (c#) n'ont pas fait d'études d'info mais viennent d'autres filières avec parfois une formation courte en dev. Et là effectivement il y a beaucoup de notions sur ce qu'est un ordi, un langage de prog et comment le tout fonctionne qui sont passé à la trappe. Mais rien qui ne peut pas être apris par la suite, et donc à vous d'apprendre aux nouveaux les concepts si ils ne les ont pas.
ps: en bonus pour ceux qui font du c#, je vous recommande l'excellent Jamie King sur youtube qui justement explique bien les notions de c# et décortique certaines syntaxes pour montrer que rien n'est magique mais plutot bien pensé.
C'est le problème avec les langages plus " " "récents" " " (je mets des guillemets à foison car je pense à Java et à C# qui sont loin d'être récents). À les écouter le C++ a ses limites et ils sont là pour les résoudre. Mais ils finissent par singer le C++ d'une manière où d'une autre. Prenons l'exemple de l'héritage. "L'héritage c'est mal, surtout quand il est multiple." Soit. Mais que proposent des langages comme Java ou C# pour pallier à cela ? Des concepts alambiqués d'interfaces et de traits (pas forcément en Java et en C# pour ces derniers), qui quelque part reviennent à faire de l'héritage multiple sans en dire le nom. Idem avec l'abus des références pour ne pas prononcer le gros mot "pointeur", surtout quand t'as une référence null à gérer comme ton pointeur NULL en C/C++. En face de tout ça t'as le C++ qui est franc du collier au possible. Il veut faire de l'héritage multiple ? Il en fait et il le dit clairement, sans enfumer son monde avec des traits et des interfaces. Il veut utiliser des pointeurs ? Il les utilise ! Les références ça existe en C++ mais l'usage est légèrement différent. Les jeunes générations sont bercées par les "limites du C++" dont Java, C# et toute la clique viennent nous sauver. Alors qu'en fait ils font comme en C++ mais sans en dire le nom, afin de ne surtout pas dévoiler la supercherie. Une querelle des anciens et des modernes, en quelque sorte.
Je ne dis pas que le C++ est parfait. Mais il n'y a pas grand chose en POO Java ou C# que tu ne puisses pas faire tout aussi bien (voire mieux) en bon vieux C++ (hors côté WORA). Au contraire les autres seraient même plus que limités par rapport à C++. Je pense entre autres à l'héritage protégé. Si je dois en faire alors la question de l'utilisation du C++ pour faire ce que j'ai à faire ne se pose même pas.
Rust n'a pas vocation à remplacer le C++, ne serait-ce que parce qu'il ne fait pas de POO, du moins pas ouvertement et dans les règles de l'art. Il n'y a ni classes ni héritage ni surcharges en Rust, mais seulement des modificateurs de visibilité (encapsulation) et de l'implémentation de traits (tiens donc !). Va faire correctement de la POO sans ça. Rust est plus à même de remplacer le C que le C++ car il est plus proche d'un "C with classes" intermédiaire entre C et C++ que du C++.
Pour le reste C++ aurait donc avant tout besoin de sucre syntaxique. "C++ n'a pas les interfaces", mais quelle est la différence entre une interface et une classe abstraite composée exclusivement de méthodes virtuelles pures et publiques (et d'attributs publiques statiques) ? Pourquoi l'une plutôt que l'autre, surtout dans un langage tolérant l'héritage multiple ?
+1. Un langage c'est avant tout un tas de concepts implémentés avec de la syntaxe. Si t'as les concepts généraux alors tu sauras retrouver tes petits peu importe le langage. Tu seras dans tes pantoufles à peu près partout. Une boucle conditionnelle reste une boucle conditionnelle, que ce soit en C, C++, Java, C#, Kotlin, Python, PHP, Ruby, Swift, Go, Rust, VB(.NET), JavaScript... Ce n'est pas parce qu'on dit switch en C++ mais match en Rust que les concepts derrière en sont fondamentalement différents. Il peut y avoir des subtilités, celles de l'implémentation du concept dans le langage, mais au fond c'est la même chose.
Le problème avec les syntaxes est que les gros langages ont presque tous ("presque" parce que Python) des syntaxes proches, fortement inspirées de celle du C. Du coup tu peux aller encore plus vite donc encore plus mal sur ce point.
Qt est disponible sous licence LGPL. Donc à moins de modifier Qt ou de compiler en statique tu peux utiliser la version gratuite et open source de Qt dans un projet pro. Certains outils intéressants comme le Qt Quick Compiler (pour compiler tes fichiers QML et ainsi gagner en performance) sont désormais disponibles dans la version gratuite. La version gratuite de Qt peut convenir à beaucoup de projets pro, enfin je pense.
Le comparatif est disponible ici : https://www.qt.io/download
Ouais bof![]()
Lorsque tu vois que le switch en JavaScript prend en charge les chaînes de caractères. Pour moi ce n'est pas que du sucre syntaxique.
Lorsque tu vois que le switch en Delphi prend en charge les intervalles de valeurs. Pour moi ce n'est pas que du sucre syntaxique.
Lorsque tu vois comment JavaScript gère les fermetures (closures). Ce n'est pas comparable avec le C++, et le problème du double [ (<- si je ne dis pas de bêtises)
J'ai travaillé en Objective-C, et l’introspection (tester si une classe a ou pas une méthode) c'est très utile. Mais, on va encore me sortir "en C++, on ne paye pas le surcoût"
Il y aussi le support de l'Unicode : je sais que c'est un sujet glissant, et que le PHP s'est troué sur ce sujet. Mais ce n'est pas glorieux.
Mais on peut déjà vérifier à la compilation si une fonction membre existe ou pas. Après le C++ ne dispose pas encore d’introspection, mais cela devrait dans quelques années.
match est quand même vachement plus puissant qu'un switch, ce n'est pas pour rien qu'il y a des propositions d'un mot clef similaire (inspect) qui regroupe std::visit, structured bindings en plus puissant et if constexpr. Au bout d'un moment, il faut voir au-delà du simple sucre syntaxique. (Ce n'est pas passé dans le 20, mais il y aura probablement quelque chose de similaire dans les normes suivantes.)
En fait c'est assez simple, tu as le droit de faire une liaison statique, ceux qu'impose la LGPL c'est de permettre à l'utilisateur de changer la version de Qt dans ton soft, donc en liaison dynamique tu changes les dlls (sous windows).
Pour la liason statique il faut juste que le développeur offre la possibilité à l'utilisateur de faire la liaison statique avec une autre version de Qt (même ABI bien sûr).
Là ou cela est compliqué c'est pour l'embarqué/mobile, imagine un constructeur qui laisse changer le logiciel...par contre à ce niveau y a un biais juridique sur qui est l'utilisateur, vous qui vendez le matériel ? ou l'utilisateur final ?
Il y a avait eu une vidéo qui expliquait cela pour du matériel médical et la LGPL...
L'inconvénient avec la licence Qt c'est la fait qu'il faille payer avant de démarrer un projet. Un projet qui démarre en GPL/LGPL ne peut pas ensuite basculer en commercial. De plus le prix est donné par mois et non pas pour un achat de licence final (on paye la version Qt 5.13 une fois et on fait ce que l'on veut avec). C'est surtout cette partie qui est compliqué avec Qt. Et à 4500 euros/an c'est cher...
Le comité ISO C++ a proposé une feuille de route pour C++ 23 et finalisé la nouvelle version du langage C++ 20,
la norme devrait être publiée dans les mois à venir
La dernière réunion du comité ISO C++ s’est tenue à Prague, en République tchèque. Durant cette réunion, le comité a fait des ajouts au brouillon de C++ 20 et a opté pour l'envoyer au Draft International Standard (DIS) pour approbation finale et publication. Sur le plan de la procédure, il est possible que le DIS soit rejeté, mais en raison des procédures et processus du comité, il est très peu probable que cela se produise. Cela signifie que le développement de C++ 20 est terminé, et dans quelques mois la norme sera publiée.
Lors de la réunion, les modifications et ajouts suivants au projet C ++ 20 :
- Amélioration de la reconnaissance contextuelle du « module » et de « l'importation » pour permettre aux outils non compilateurs tels que les systèmes de génération de déterminer plus facilement les dépendances de génération.
- Ajout de plusieurs nouveaux algorithmes de classement.
- Ajout de ranges::ssize.
- Affinage de la signification de static et inline dans les interfaces de module (P1779 et P1815).
- Résolution de nombreux problèmes de langage et de bibliothèque de base et amélioration substantielle des spécifications.
Les éléments suivants sont des fonctionnalités clés dans C++20 :
- Les Modules.
- Les Coroutines.
- Les Concepts.
- Les Ranges.
- Les constexprification: constinit, consteval, std::is_constant_evaluated, constexpr allocation, constexpr std::vector, constexpr std::string, constexpr union, constexpr try and catch, constexpr dynamic_cast and typeid.
- std::format("For C++{}", 20)
- operator<=>
- Macros de test de fonctionnalités.
- std::span
- std::source_location.
- std::atomic_ref.
- std::atomic::wait, std::atomic::notify, std::latch, std::barrier, std::counting_semaphore, etc.
- std::jthread and std::stop_*.
Comme l’explique Herb Sutter, président du comité de normalisation ISO C++, les Modules constituent une nouvelle alternative aux fichiers d’entête et apportent un certain nombre d’améliorations clés notamment en isolant les effets des macros et en permettant des générations évolutives. Cette fonctionnalité permet aux utilisateurs du langage de définir une limite d’encapsulation. Il existait jusque-là trois fonctionnalités de ce type qui permettent aux développeurs de créer leurs propres mots de pouvoir en (a) donnant un nom défini par l'utilisateur en (b) quelque chose dont l'implémentation est cachée, explique Sutter. Ce sont : la variable (qui encapsule la valeur actuelle), la fonction (qui encapsule le code et le comportement) et la classe (qui encapsule les deux pour délivrer un ensemble d’états et de fonctions).
Même des fonctionnalités majeures telles que les Modèles constituent des moyens de décorer ou de paramétrer ces trois fonctionnalités fondamentales. À ces trois, est ajoutée maintenant une quatrième, les Modules qui encapsulent les trois pour en livrer un ensemble. Les Coroutines quant à elles, sont des fonctions qui peuvent suspendre et reprendre leur exécution tout en conservant leur état. L'évolution en C++ 20 va encore plus loin. Le terme Coroutines est inventé par Melvin Conway. Il l'a utilisé dans sa publication pour la construction d'un compilateur en 1963. Cette fonctionnalité existe également dans les langages comme Python. L'implémentation spécifique de Coroutines en C++ est un peu intéressante. Au niveau le plus élémentaire, il ajoute quelques mots-clés à C++ comme co_return, co_await, co_yield ainsi que des types de bibliothèques qui fonctionnent avec eux. Une fonction devient une coroutine en ayant une de ces fonctions dans son corps.
std::format
std::format ajoute la prise en charge des chaînes de format à la bibliothèque standard C++, y compris pour les paramètres de type sécurisé et de position. Si vous connaissez les chaînes au format Boost.Format ou POSIX, ou même simplement printf, vous saurez exactement de quoi il s'agit. Selon lui, std::format donne le meilleur de printf (commodité) et le meilleur de iostreams (sécurité et extensibilité des iostreams), mais il ne se limite pas à iostreams. Il vous permet également de formater n’importe quelle chaîne. « Cela fait longtemps que j'attends cela, de sorte que je n'aurai plus jamais à utiliser l’entête iomanip », a-t-il déclaré à propos.
Les conteneurs constexpr
Les conteneurs constexpr suivants ont été ajoutés à la norme C++ 20 : constexpr INVOKE, constexpr std::vector et constexpr std::string. Selon Sutter, cela signifie que beaucoup de code C++ ordinaire peut être exécuté à la compilation, y compris même les conteneurs std::vector et chaînes dynamiques standard. « C’était quelque chose qui aurait été difficile à imaginer il y a quelques années à peine, mais cela montre de plus en plus que nous sommes sur un chemin où nous pouvons exécuter du code C ++ simple au moment de la compilation au lieu d’essayer d’exprimer ces calculs sous forme de métaprogrammes de modèle », a-t-il précisé à propos de ces ajouts et constexpr std::string.
Au cours de cette réunion, le comité a également adopté un plan pour C ++ 23, qui inclut la hiérarchisation d'une bibliothèque standard modulaire, le support de bibliothèque pour les coroutines, les exécuteurs et la mise en réseau. Elle est prévue à Varna (en Bulgarie).
Évolution du langage
Evolution Working Group Incubator (EWGI) Progress
L'incubateur EWG s'est réuni pendant trois jours à Prague et a examiné et commenté 22 articles pour C ++ 23. 10 de ces documents ont été transmis à Evolution, éventuellement avec quelques révisions demandées. Notamment:
- Élision de copie garantie pour les objets de retour nommés
- Déclaration et utilisation généralisées de pack
- Modèles de membres pour les classes locales
Plusieurs articles ont reçu beaucoup de commentaires et reviendront à l'incubateur, probablement à Varna:
- Un opérateur pipeline-rewrite
- Des paramètres template universels
- Captures lambda partiellement mutables
- C ++ devrait prendre en charge la compilation just-in-time
Concernant les paramètres template universels, imaginez-vous essayer d'écrire une métafonction pour apply :
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template <template <class...> class F, typename... Args> using apply = F<Args...>; template <typename X> class G { using type = X; }; static_assert(std::is_same<apply<G, int>, G<int>>{});// OK
Dès que G essaie de prendre n'importe quel type de NTTP (paramètre de template non-type) ou un paramètre de template-template, apply devient impossible à écrire; nous devons fournir des types de paramètres analogues pour chaque combinaison de paramètres possible:
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 template <template <class> class F> using H = F<int>; apply<H, G>// error, can't pass H as arg1 of apply, and G as arg2
La solution proposée ? Un moyen de spécifier un paramètre template vraiment universel qui peut se lier à tout ce qui peut être utilisé comme argument template. Appelons le template auto. « La syntaxe est la meilleure que nous puissions trouver; mais il existe de nombreuses façons inexplorées d'orthographier un tel paramètre template ». Par exemple :
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template <template <template auto...> class F, template auto... Args> using apply = F<Args...>; apply<G, int>;// OK, G<int> apply<H, G>;// OK, G<int>
Le nouveau paramètre template universel introduit des généralisations similaires à l'universel auto NTTP ; afin de permettre le pattern-matching sur le paramètre, les classes template doivent également pouvoir être spécialisées sur le type de paramètre:
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 template <template auto> struct X; template <typename T> struct X<T> { // T is a type using type = T; }; template <auto val> struct X<val> : std::integral_constant<decltype(val), val> { // val is an NTTP }; template <template <class> F> struct X<C> { // C is a unary metafunction template <typename T> using func = F<T>; };
Source : Rapport du comité C++
Contribuez au club : Corrections, suggestions, critiques, ... : Contactez le service news et Rédigez des actualités
Ah oui, quand même. C'est un nouveau langage en fait.
en tout cas, visiblement le problème de syntaxe de c++ ne pose pas de problème qu'à moi, vu la proposition epochs : http://www.open-std.org/jtc1/sc22/wg...0/p1881r1.html
Partager