Sortie de Boost 1.46

Posté par . Modéré par patrick_g.
51
23
fév.
2011
Linux

Une nouvelle version de Boost vient de sortir après trois mois de gestation.

Boost est une compilation de pas moins de 104 bibliothèques logicielles multiplateformes et sous licence libre (licence semblable à la Licence_MIT) écrites en C++. Plusieurs bibliothèques ajoutées au standard TR1 ont d'ailleurs pour origine Boost, comme les bibliothèques "array" et "regex".

Ces bibliothèques exploitent généralement de manière intensive la programmation par template, ce qui en font des bibliothèques génériques pour résoudre une large palette de problèmes.

Une nouvelle bibliothèque permettant de gérer des listes d'intervalles de manière générique fait son apparition. Elle a été nommée ICL pour Interval Container Library. Cette bibliothèque est particulièrement utile pour gérer des intervalles de temps qui se suivent ou qui se chevauchent.

Parmi les autres bibliothèques existant depuis plus longtemps, on citera :

  • Asio : pour faire de la programmation synchrone et asynchrone sur les entrée/sorties et notamment de la programmation réseau ;
  • Date Time : pour exploiter tout ce qui est relatif au temps ;
  • Filesystem : pour parcourir facilement le système de fichiers ;
  • GIL : pour manipuler des images avec différents algorithmes de manière générique ;
  • Interprocess : pour communiquer entre processus ;
  • Proto : pour créer des langages embarqués au coeur du c++ ;
  • Regex : pour manipuler des expressions régulières ;
  • Serialization : pour sérialiser les objets c++ ;
  • SharedPtr : pour gérer la durée de vie des objets alloués de manière automatique sans utiliser de Ramasse miettes ;
  • Signal : pour gérer le concept de signal/slot de manière native en c++ sans passer par un préprocesseur comme dans le framework Qt ;
  • Spirit : pour créer des compilateurs en suivant la syntaxe EBNF nativement en C++ ;
  • Thread : pour faire de la programmation concurrentielle de bas niveau.
  • # Boost vs Qt

    Posté par (page perso) . Évalué à 10.

    Qui lance un petit troll Boost vs Qt ? :)

    • [^] # Re: Boost vs Qt

      Posté par (page perso) . Évalué à 10.

      pas besoin, tout le monde sait très bien que Qt est :

      • plus performant
      • plus simple
      • plus mieux
    • [^] # Re: Boost vs Qt

      Posté par (page perso) . Évalué à 10.

      Pas besoin tout le monde sait que boost.signals pulvérise la saloperie de moc de Qt.

      http://devnewton.bci.im

      • [^] # Re: Boost vs Qt

        Posté par . Évalué à 2.

        100% d'accord !
        D’ailleurs, de même pour sigc++

      • [^] # Re: Boost vs Qt

        Posté par . Évalué à 1.

        Boost.Signals2 plutôt. Je pense que la précision n'est pas trop, car les deux versions cohabitent dans Boost.

    • [^] # Re: Boost vs Qt

      Posté par (page perso) . Évalué à 8.

      Pas besoin,

      plus personne n'utilise le C++

      • [^] # Re: Boost vs Qt

        Posté par . Évalué à 2.

        En fait, C++ c'est Python--

        Article Quarante-Deux : Toute personne dépassant un kilomètre de haut doit quitter le Tribunal. -- Le Roi de Cœur

        • [^] # Re: Boost vs Qt

          Posté par . Évalué à 6.

          Même si l'écriture d'un code Python est plus simple (et encore, c'est un point de vue subjectif… je n'arrive pas à concevoir qu'on puisse préférer un typage dynamique à un typage statique lorsque l'on programme autre chose qu'un script ou qu'une petite bricole jetable), C++ est au moins 10 fois plus rapide que Python.

          Ces deux langages n'ont pas du tout la même utilité. Opposer l'un à l'autre n'a absolument pas de sens.

          • [^] # Re: Boost vs Qt

            Posté par . Évalué à 0.

            Peut etre parceque la majorite des personnes utilisant un langage tel que python ne sont pas et non aucune vocation de devenir ingenieurs programmeurs? Doit on rappeler qu'un des premiers langage de programation fut le Fortran qui veut dire "FORmula TRANslator" et qui avait ete cree pour les physiciens et non pas pour les informaticiens?

            Ce sont deux langages qui n'ont ni le meme but ni la meme vocation.

            • [^] # Re: Boost vs Qt

              Posté par . Évalué à 1.

              Et c'est pour ça que le C++ n'est pas utilisé ? Vive les script kidies au moins ça permettras de troller encore longtemps sur les performances, les bugs et le manque de qualité des logiciels ?

              Les logiciels sous licence GPL forcent leurs utilisateurs à respecter la GPL (et oui, l'eau, ça mouille).

              • [^] # Re: Boost vs Qt

                Posté par . Évalué à 1.

                C'est pour cela que le C++ n'est pas <b>adapte</b> a tout le monde. Maintenant tu peux penser que tout le monde a le temps d'apprendre et de rester a la page sur les subtilites du C++ mais bon ce n'est pas le cas et le C++ est typiquement le genre de langage que si tu ne l'utilise pas regulierement tu as des problemes et boost et sa documentation n'arrange rien.

                • [^] # Re: Boost vs Qt

                  Posté par . Évalué à 1.

                  Comme il n'est pas adapté à tout le monde, il n'est pas utilisé ?

                  Les logiciels sous licence GPL forcent leurs utilisateurs à respecter la GPL (et oui, l'eau, ça mouille).

        • [^] # Re: Boost vs Qt

          Posté par . Évalué à 7.

          C'est claire que c'est le top de se taper des incompatibilités de versions, de s'embarquer 2 ou 3 interpréteurs par OS, d'avoir des perf pourries à moins de réécrire des parties en code natif (et donc de gérer plusieurs langages dans un même projet), de ne pas avoir de déclaration, ni de typage statique du coup adieux l'analyse statique,...

          L'évolution comme tu la vois, moi j'en veux pas.

          Les logiciels sous licence GPL forcent leurs utilisateurs à respecter la GPL (et oui, l'eau, ça mouille).

          • [^] # Re: Boost vs Qt

            Posté par . Évalué à 2.

            En terme de quantité de connaissances et compétences, je trouve plus simple de gérer Python/C ou Python/fortran, avec pour le premier cas une API (je suis en train de m’y mettre) et dans le second une ou deux commandes et quelques pièges. Le C++ est un langage que je trouve assez monstrueux à apprendre et à pratiquer en comparaison, ne serait-ce que les exemples de code qui ont été donnés en commentaires.

            La différence, àmha, est que sans connaître le langage, le Python ou le Fortran se lisent, le C moins, le C++ pas du tout.

            • [^] # Re: Boost vs Qt

              Posté par . Évalué à 2.

              Tu n'as pas encore lu du Ocaml. Et pourtant, c'est sacrément productif.

              "La première sécurité est la liberté"

          • [^] # Re: Boost vs Qt

            Posté par . Évalué à -3.

            Tu as bien raison. Vive l'assembleur!!

            Quoique c'est déjà un peu trop éloigné du matériel. C'est pour ça que je programme en code binaire directement comme ça j'évite toute perte de vitesse du code, et je peux exécuter mon code sans cette étape lente de compilation. Ça c'est un vrai langage de script!

            • [^] # Re: Boost vs Qt

              Posté par . Évalué à 2.

              Le duck typing n'est pas une bonne solution dans bien des cas. Le montrer comme une évolution logique, qui n'a pas d'alternative est juste ridicule. Il y a une foule d'autre de techniques très récentes (bien plus que le duck typing).

              Les logiciels sous licence GPL forcent leurs utilisateurs à respecter la GPL (et oui, l'eau, ça mouille).

              • [^] # Re: Boost vs Qt

                Posté par (page perso) . Évalué à 1.

                Tu m'intéresses. Je n'ai pas de prétentions particulières, je développe comme ça dans mon coin en amateur. Je me suis mis au Python récemment et je dois dire que j'apprécie assez le typage dynamique. Mais si il existe d'autres solutions "plus propres" et moins contraignantes qu'un typage explicite comme en C/C++, je suis preneur.

                ;)

                There is no spoon...

                • [^] # Re: Boost vs Qt

                  Posté par . Évalué à 2.

                  Non que je sache il en existe pas des millions, statique, dynamique, automatique, sans typage. Elles ont toutes leurs avantages et leurs inconvénients. Je ne dis pas que le typage dynamique est mauvais juste qu'il n'est pas un absolu qui écrase tout le reste (sauf lors de troll).

                  Ce que j'entendais par techniques, c'est qu'il existe un certains nombres de techniques pour pour traiter du code après ton passage et pour cela il faut un typage statique afin que le type de tes variables soit déterministe et que les outils aient un maximum d'informations sur le code. Ça permet d'obtenir un code beaucoup plus fiable.

                  Les logiciels sous licence GPL forcent leurs utilisateurs à respecter la GPL (et oui, l'eau, ça mouille).

                • [^] # Re: Boost vs Qt

                  Posté par (page perso) . Évalué à 1.

                  Des langages comme Ocaml ou Haskell fournissent un typage statique, sans pour autant devoir annoter à la main toutes les variables, par example.

                  • [^] # Re: Boost vs Qt

                    Posté par . Évalué à 2.

                    En fortran aussi si tu utilises les implicit ce qui est une source a emmerde et a bug monstrueux mais les codes utilisant cela (ainsi que les common) existent et sont utilises dans certains domaines.

    • [^] # Re: Boost vs Qt

      Posté par . Évalué à 2.

      A titre perso, j'aime beaucoup Qt, néanmoins il comporte pour moi un gros défaut: parfois (lors de l'utilisation de trucs spécifique moc) on ne découvre certaines erreurs qu'au runtime, notamment certaines erreurs de syntaxe qui ne devraient pas passer la phase de compil.

  • # Boost ? c'est quoi ?

    Posté par . Évalué à 9.

    je repose ici la question que je posais en moderation, à part etre une metabibliotheque permettant de faire plusieurs choses, qu'est ce que cela booste ?

    le developpement ? une bibliotheque pour les diriger toutes ?

    l'execution ? les bibliotheques sont ultra optimisées pour les performances ?

    bref, en quoi c'est mieux que GTK, QT, ou les autres frameworks ?

    • [^] # Re: Boost ? c'est quoi ?

      Posté par . Évalué à 5.

      Je dirais que c'est portable pour C++, que cela se veut l'équivalent d'une lib fournis de base (STL c'est vieux)et non dans un environnement comme Qt.

      "La première sécurité est la liberté"

    • [^] # Re: Boost ? c'est quoi ?

      Posté par . Évalué à 8.

      C'est différents, tu trouves dans boost des trucs qui ne sont pas dans les autres framework, pour faire du calcul numérique par exemple. [http://www.boost.org/doc/libs/?view=category_Math]

      À contrario t'as pas de bibliothèque de widget, c'est clairement pas un "framework" pour faire des applications Desktop ou des interfaces. C'est plus orienté développement, algorithmique et aide au codage en C++ (structure de données avancées, aide à la gestion mémoire) que les libs poussent parfois dans ses retranchements avec des utilisations intensives de template.

      Je crois pas qu'il y ait un focus particulier sur les performances, mais ça reste du C++, et ça dépend un peu des libs.

      À l'usage, et si ça couvre tes besoins, c'est une aide plutôt appréciable parce que ça couvre un ensemble de besoins parfois assez particuliers assez large. C'est centralisé donc facilement installable, packagé dans les distribution et tout, et une très bonne aide au développement, même si c'est pas un framework en tant que tel.

      • [^] # Re: Boost ? c'est quoi ?

        Posté par . Évalué à 2.

        Ouhais mais vu la doc c'est pas des plus simples a utiliser.

        • [^] # Re: Boost ? c'est quoi ?

          Posté par . Évalué à 2.

          Faut pas généraliser, t'as des trucs très simples. Après forcément si t'as été taper dans les biblio pour faire des fonctions génériques d'ordre supérieur avec des templates c'est moins évident :)

          Faut connaître aussi un peu le C++, qui n'est pas forcément le langage le plus accessible et évident du monde.

          • [^] # Re: Boost ? c'est quoi ?

            Posté par . Évalué à 0.

            Je n'ai pas dit que toute la doc etait complique voir incomprehensible mais lorsque j'ai eu besoin de l'utiliser j'ai personnellement trouve que c'etait complique et peu clair. Peut etre que pour les pros du C++ cela ne l'est pas mais pour quelqu'un qui n'utilise ce langage que occasionnellement si.

            • [^] # Re: Boost ? c'est quoi ?

              Posté par . Évalué à 6.

              Moi, boost m'a permis de comprendre que je n'étais pas fait pour le C++. Depuis, je ne veux plus en faire, ce qui est un cercle vicieux puisque je n'en fait plus, et donc je ne m'ameliore pas.

    • [^] # Re: Boost ? c'est quoi ?

      Posté par . Évalué à 10.

      Sinon que ce soit Qt ou GTK, les deux ont cherché à créé une bibliothèque graphique et ce sont étendu pour essayer de gérer pas mal de chose pour tenter de garantir une portabilité et une homogénéité (simplifier la vie du développeur avec des composant de plus en plus complexes et gros).

      boost n'a pas le même objectif. boost ne fait rien de graphique. boost c'est comme une bibliothèque standard mais qui évolue plus vite. L'objectif c'est de pouvoir utiliser des techniques récentes et sophistiquées sans faire évoluer le langage et sa norme. boost ça permet de faire des lambdas termes, des foreach, des matrices creuses,... des choses sur les quels les bibliothèques graphiques ne travaillent pas.

      Par contre Qt, c'est de plus en plus un framework qui essaie de tout refaire et qui s'offre même le culot d'avoir des incompatibilités avec la bibliothèque standard et la STL (ce que boost ne fait pas).

      Les logiciels sous licence GPL forcent leurs utilisateurs à respecter la GPL (et oui, l'eau, ça mouille).

      • [^] # Re: Boost ? c'est quoi ?

        Posté par (page perso) . Évalué à 9.

        • Qt 1991 (création Trolltech en 1994)
        • STL C++ 1994 (approbation ANSI/ISO)

        Probable que si Qt avait été démarré quelques années plus tard, avec des réalisations de la STL disponibles un peu partout (et supportées par les compilos), ils l'auraient adopté pour Qt. Mais quand ils ont commencé, ça n'était pas possible.

        • [^] # Re: Boost ? c'est quoi ?

          Posté par . Évalué à 3.

          Quand ils ont commencé en effet. Mais je pense que 17 ans c'est un temps convenable pour améliorer les choses. Surtout que tu parle du début du développement, même si on peut imaginer que pour la version 1 (sorti en 1995) ça faisait un peu tôt, ils ont eu 3 versions majeurs pour corriger le tir (16 ans de développement). donc 3 occasions de casser la compatibilité avec l'ancienne version pour être enfin compatible avec le reste du monde.

          Les logiciels sous licence GPL forcent leurs utilisateurs à respecter la GPL (et oui, l'eau, ça mouille).

          • [^] # Re: Boost ? c'est quoi ?

            Posté par . Évalué à -3.

            Le seul probleme c'est que la norme C++ st sorti l'annee derniere seulement. Et Qt4 la derniere version majeur est bien plus ancienne!

            • [^] # Re: Boost ? c'est quoi ?

              Posté par (page perso) . Évalué à 4.

              La norme en vigueur aujourd'hui, c'est plutôt 2003, donc 8 ans. Qt4 n'est pas si vieux.

              • [^] # Re: Boost ? c'est quoi ?

                Posté par . Évalué à 4.

                Je crois même que le premier standard C++ qui a inclus la STL est sorti en 1998. Le standard de 2003 n'est qu'une correction de celui de 1998.

                Donc l'argument « Oui mais Qt est sorti avant la STL » ne tient vraiment plus.

                • [^] # Re: Boost ? c'est quoi ?

                  Posté par (page perso) . Évalué à 1.

                  En fait, c'est surtout l'existence d'une implémentation correcte tant au niveau performances, portabilité et respectueuse de la norme qui posait encore problème en 2003. Surtout dans le cas d'un certain environnement propriétaire bien connu.

                  Ceci dit, depuis le temps, Qt aurait dû réécrire ces classes utilitaires en terme de classes standard, et conseiller l'usage des classes standard quand c'est possible.

                  De toute façon, Qt c'est moche, graphiquement :D

          • [^] # Re: Boost ? c'est quoi ?

            Posté par (page perso) . Évalué à 1.

            Tu pourrais être plus précis sur les incompatibilités entre Qt et la STL ?

            Tous les containers Qt sont compatibles avec la STL, tous les itérateurs façon STL sont aussi disponibles dans Qt donc tu peux en théorie allègrement mélanger les deux.

            C'est sûr qu'ils ont leur propres containers dont ils contrôlent eux-même la performance et la portabilité et les fonctionnalités (support des threads, etc), ce qui personellement ne me choque pas (et surtout, je préfère les syntaxes Qt, ça fatigue moins les doigts).

            • [^] # Re: Boost ? c'est quoi ?

              Posté par . Évalué à -2.

              La première qui me viens en tête et la plus connu c'est QString qui n'hérite pas de std::string : http://doc.qt.nokia.com/latest/qstring.html

              Les logiciels sous licence GPL forcent leurs utilisateurs à respecter la GPL (et oui, l'eau, ça mouille).

              • [^] # Re: Boost ? c'est quoi ?

                Posté par . Évalué à 1.

                N'etant pas specialiste, loin de la du C++, j'ai tout de meme l'impression que la raison vient du fait que Qstring travaille avec de l'unicode quand std:string n'accepte que de l'ASCII. Est-ce que cela rime a grand chose d'heriter de std::string par consequent?

                • [^] # Re: Boost ? c'est quoi ?

                  Posté par (page perso) . Évalué à -2.

                  Pourtant le code suivant compile:

                  #include <iostream>
                  #include <string>
                  #include <cstdlib>
                  
                  int main(int argc, char *argv[]) {
                          std::string *str=new std::string("Héllo World");
                          std::cout << *str << std::endl;
                          return EXIT_SUCCESS;
                  }

                  Et ça marche:

                  xavier@xavier-laptop tmp $  g++ -Wall ./test.cpp 
                  xavier@xavier-laptop tmp $  ./a.out 
                  Héllo World

                  « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

                  • [^] # Re: Boost ? c'est quoi ?

                    Posté par . Évalué à 2.

                    Comme deja dit je ne suis pas un pro du C++ mais essaye avec UTF-16 et la cela ne devrait plus fonctionner d'apres ce que j'ai pu lire (d'ou la presence de std::wstring). Au lieu d'avoir 2 class il y en a une seule pour Qt. Puis il y a l'histoire qui joue peut etre dans le pourquoi :)

                  • [^] # Re: Boost ? c'est quoi ?

                    Posté par (page perso) . Évalué à 4.

                    En fait le compilateur prend exactement la série de caractères que tu mets dans ta string sans chercher à comprendre. Elle arrive telle que dans le binaire. Et ensuite l'affichage dépend de la locale. J'ai déjà compilé du code en ISO-8859-15 avec accents pour utilisation dans une fenêtre DOS en CP 850 par exemple, et ça ne marche pas.

                    À l'époque, j'étais passé par boost::format pour écrire

                    boost::format fmt(_("Cards in \"%1%\": %2%"));

                    où la fonction _() peut être gettext() pour l'internationalisation s'il est disponible.

                  • [^] # Re: Boost ? c'est quoi ?

                    Posté par (page perso) . Évalué à 3.

                    Et ça marche:

                    Chez toi, ça marche. Il n'y a aucune garantie qu'ailleurs ça marche (codepage différent). Tu cherches les emmerdes.

                    tu sais au moins en quelle locale tu a enregistré ton fichier? Latin-9 ou UTF-8 ou Japonais? Qu'un autre sache comment compiler le source et/ou exécuter ton binaire...

                    Joli de penser franco-français, comme si tout le monde avait la même locale.

                    • [^] # Re: Boost ? c'est quoi ?

                      Posté par (page perso) . Évalué à -2.

                      Si tu avais lu le thread avant de troller, tu aurais compris que je démontrais juste que std::string acceptait autre chose que l'ASCII, mon exemple marche avec n'importe quel encodage qui gère le caractère é.

                      « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

                      • [^] # Re: Boost ? c'est quoi ?

                        Posté par (page perso) . Évalué à 5.

                        std::string accepte ce que tu veux (du binaire aussi si tu as envie, et même du binaire avec des NULL à l'intérieur, il s'en fou), oui.

                        Ca n’empêche pas que ton code est mauvais, non portable, à éviter à moins que tu ais envie de jouer avec des des rapports de bugs comme quoi ça ne marche pas suivant l'OS, la locale etc... Ce n'est pas un exemple à utiliser (non, je ne sais pas exemple utiliser pour la démonstration, mais en tous cas, pas celui-la)

                  • [^] # Re: Boost ? c'est quoi ?

                    Posté par . Évalué à 4.

                    Oh la jolie fuite de mémoire ;) Dommage que la solution correcte dans ce cas est de virer le pointeur, sinon ça aurai pu faire de la pub pour les pointeurs intelligents de boost.

                  • [^] # Re: Boost ? c'est quoi ?

                    Posté par (page perso) . Évalué à 3.

                    Ce que tu ne sembles pas comprendre, c'est que le type std::string ne gère aucun encodage. L'autre chose que tu ne comprends pas, c'est qu'il y a beaucoup de code illégal qui compile, et qui semble marche étrangement sur ta machine. Par exemple, un buffer overflow est typiquement le résultat d'un programme « ça marche chez moi ».

                    • [^] # Re: Boost ? c'est quoi ?

                      Posté par (page perso) . Évalué à 0.

                      Ce que tu ne sembles pas comprendre, c'est que le type std::string ne gère aucun encodage.

                      Ce que tu ne semble pas comprendre, c'est que je voulais juste montrer que ça marchait avec autre chose que de l'ASCII. C'est tout ce que je voulais montrer. Et je l'ai bien compiler en Wall pour montrer que le compilateur ne râle aucunement.

                      « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

                      • [^] # Re: Boost ? c'est quoi ?

                        Posté par (page perso) . Évalué à 1.

                        Que le code compile n'est pas une garantie de légalité. Il y a beaucoup de comportements indéfinis, qui supprime toute garantie de fonctionnement s'ils sont utilisés. C'est pour ça que l'argument « ça marche » n'a aucune légitimité dans un débat sur les technologies liées au développement.

                        class base { int n ; public:  virtual ~base() { } ; } ;
                        class derivated : public base { double d ; } ;
                        
                        int main()
                        {
                          base * a = new derivated [100] ;
                          delete [] a ; // Oops
                        }
                        • [^] # Re: Boost ? c'est quoi ?

                          Posté par . Évalué à 3.

                          En même temps, utiliser delete à la main dans un code C++/boost, c'est un peu comme utiliser un goto. Tu peux t'en passer dans 99% des cas, ça t'évitera de faire des erreurs et ça rendra ton code plus court et plus lisible.

                          • [^] # Re: Boost ? c'est quoi ?

                            Posté par (page perso) . Évalué à 2.

                            Goto c'est très pratique en C. Je t'invites à aller fouiner du côté du code source de Linux.

                            Mon propos était de montrer du code qui compile, que ce n'est donc pas un critère suffisant pour déterminer la légalité d'un code source.

                            J'aimerais que tu m'expliques comment tu fais pour te passer de l'allocation dynamique en C++. Alors certes, l'usage d'un RAII et d'un helper sont conseillés, mais new et delete sont nécessaires à la vie quotidienne du développeur C++.

                            • [^] # Re: Boost ? c'est quoi ?

                              Posté par . Évalué à 1.

                              tu peux utiliser les smart pointers pour ne pas faire de delete... cf: boost

                              • [^] # Re: Boost ? c'est quoi ?

                                Posté par (page perso) . Évalué à 1.

                                Un smart pointer est un RAII…

                                • [^] # Re: Boost ? c'est quoi ?

                                  Posté par . Évalué à 2.

                                  Tu a du mal comprendre. Je répondais a ta phrase :

                                  mais new et delete sont nécessaires à la vie quotidienne du développeur C++

                                  Mais je t'assure qu'on on peut très bien s'en passer en utilisant toute la palette des shared_ptr/shared_array/weak_ptr/auto_ptr/unique_ptr/scoped_ptr/scoped/array/rollback_ptr. Je n'utilise plus de delete depuis des lustres.

                                  • [^] # Re: Boost ? c'est quoi ?

                                    Posté par . Évalué à 3.

                                    tout ça ? je crois que je vais garder ce que je connais depuis 20 ans et que je maitrise à peu près, merci

                                    • [^] # Re: Boost ? c'est quoi ?

                                      Posté par . Évalué à 4.

                                      C'est pas bien compliqué pourtant :

                                      • tout ce qui est *_ptr utilise delete, *_array utilise delete[]
                                      • scoped_* : son destructeur détruit l'objet. ne peut pas être copié.
                                      • shared_* : utilise un compteur de référence (sans gc) et détruit quand la dernière référence est détruite. peut être copié, et est donc le seul type à pouvoir être stocké dans un conteneur STL.
                                      • weak_ptr : c'est une référence faible vers un shared_ptr. Comme un shared_ptr qui ne contribue pas au compteur de référence (en gros)
                                      • auto_ptr : (c'est dans la STL au cas ou) : son destructeur détruit l'objet, mais le pointeur peut être transféré d'un auto_ptr à un autre.
                                      • unique_ptr : la même chose que auto_ptr, en version boost prévu pour le prochain standart.

                                      Personnellement, j'ajouterai les vector_ptr/set_ptr/list_ptr/...._ptr qui sont comme des vector/set/list/...<T*> sauf que le T* est détruit automatiquement. Ça évite de devoir faire des vector<shared_ptr<T*> > et ainsi d'avoir des milliers de compteurs de références qui seront toujours à 1.

                                      • [^] # Re: Boost ? c'est quoi ?

                                        Posté par . Évalué à 2.

                                        je fais du C++ à la papa et j'évite les templates et exceptions comme la peste, je crois que ça contribue à mon bonheur

                                        en fait je crois que j'avais fait ce choix à la lecture de More Effective C++ en 97...

                                        • [^] # Re: Boost ? c'est quoi ?

                                          Posté par (page perso) . Évalué à 4.

                                          En 97, c'était peut être valable (et encore), mais en 2011, il faut être carrément maso pour se passer de templates et d'exceptions.

                                          http://devnewton.bci.im

                                          • [^] # Re: Boost ? c'est quoi ?

                                            Posté par . Évalué à 1.

                                            Il faut surtout être maso pour se passer du RAII en C++. Les "if (code_retour == pas_bon) goto error;", merci bien, mais plus pour moi!

                            • [^] # Re: Boost ? c'est quoi ?

                              Posté par . Évalué à 3.

                              Sauf qu'ici on est en C++ et pas en C. En C pour découper une fonction, s'il n'y à pas de fil directeur, on se retrouve avec des sous-fonctions avec 20 arguments ou des structures avec autant. En C++ (ou dans les autres langages objets), on peut mettre cette fonction dans une classe et stocker l'état dans les variables membres.

                              Sinon, oui, reinterpret_cast<int>(NULL) = 0; compile. valgrind gueulera peut être dans ce cas la, mais pour l'encodage, Qt ou pas, STL ou pas, il faudra toujours que le programmeur fasse gaffe.

                              Sinon je n'ai jamais dit qu'on ne peut se passer de l'allocation dynamique. tant mieux, puisqu'il faudrai alors se passer de tout les conteneurs STL. Par contre, se passer de delete, c'est possible et même recommandé. voir un delete en dehors d'un destructeur c'est généralement le signe d'un code qui n'est pas exception-safe, et voir un delete dans un destructeur c'est généralement un gachi de lignes puis-qu'utiliser un pointeur intelligent (ou un conteneur intelligent de pointeur) économisera des lignes et des erreurs. de base en C++ il y a déjà un pointeur intelligent (std::auto_ptr) même si tout seul il n'est pas très utile.

                              • [^] # Re: Boost ? c'est quoi ?

                                Posté par (page perso) . Évalué à 0.

                                Je suis bien d'accord avec ça. Mais je n'allais pas écrire une classe, ce qui aurait noyé le cœur du problème pour le néophyte auquel je répondais.

                                D'ailleurs, ce n'est pas tant le « gâchis » de le ligne que la violation du principe DRY qui me gêne dans la litanie de delete dans un destructeur.

                • [^] # Re: Boost ? c'est quoi ?

                  Posté par (page perso) . Évalué à 3.

                  std:string n'accepte que de l'ASCII.

                  std::string accepte tout encodage. Ca peut très bien être UTF-8.

                  et il y a std::wstring si tu veut de l'Unicode. Le seul "hic" est que wstring est de l'UTF-16 sous Windows, et UTF-32 sous Linux, alors que QString est UTF-16 partout (comme C# aussi), donc il y a quand même quelques problèmes (et c'est galère dès que tu passes au dessus de 0xFFFF en Unicode, rare certes mais galère).

                  Tout ça pour dire que ça reste le bordel, et que ces idiots de normalisateurs de C++ foutent un beau bordel à ne jamais aller au bout de la spécification (et Unicode d'être passé de 2 octets à 4 octets), QString est un réponse, std::wstring une autre, et que la portabilité est dure quelque soit le choix.

              • [^] # Re: Boost ? c'est quoi ?

                Posté par (page perso) . Évalué à 4.

                QString n'hérite pas de std::string

                Heureusement que QString n’hérite pas de std::string ! Pareil pour QList, std::list et les autres. De toute facon la plupart des classes de la STL (dont std::string) n'ont même pas de destructeurs virtuels.

                Pour passer de std::string a QString et vis versa il y a les méthodes suivantes :

                std::string QString::toStdString() const std::wstring QString::toStdWString() const QString fromStdString(const std::string & str) QString fromStdWString(const std::wstring & str)

                Pareil pour QList :

                std::list<T> QList::toStdList() const QList<T> QList::fromStdList(const std::list<T> & list)

                Si Qt est si bien (simple, facile, puissant, intuitif, performant...) c'est aussi parcequ'ils ne se basent pas sur la STL.

                • [^] # Re: Boost ? c'est quoi ?

                  Posté par (page perso) . Évalué à 3.

                  ce qui est marrant, c'est QList à une sémantique sans aucun rapport avec std::list. L'interface ne propose aucun moyen facile par exemple pour convertir par exemple un vector<T> en QList (ah si, en passant par un QVector). Il aurait été manifestement trop simple d'avoir un constructeur prenant une paire d'itérateur en entrée, comme tous les conteneurs de la STL ... Autre truc drôle, la sémantique de at() et de [] sont sensiblement différent entre STL et Qt, pour ne donner que quelques exemples.

                  Le problème de la STL et de Boost, c'est qu'ils utilisent un modèle générique et pas un modèle objet (au passage, tu me montera où Qt est plus puissant et plus performant que la STL ...).

                  • [^] # Re: Boost ? c'est quoi ?

                    Posté par (page perso) . Évalué à 4.

                    Et qu'ils utilisent des conventions de nommage différentes (camel case vs tout en minuscule avec des underscore). C'est idiot mais moi ça me défrise.

                    • [^] # Re: Boost ? c'est quoi ?

                      Posté par . Évalué à 0.

                      Et bien a l'usage, je trouve que minuscules et underscore sont bien plus lisibles que camel case. C'est juste que dans l'enseignement on utilise partout camel case et changer ses habitudes pour mieux est parfois une dure expérience. Pourquoije trouve ça mieux? * déjà quand on tape, on gagne du temps si l'on utilise pas la complétion automatique car on n'a pas à appuyer sur shift pour utiliser des majuscules. On tape donc donc comme on écrit, vu que l'underscore est accessible sans combo clavier. * on lit plus facilement, car on ne doit pas faire l'effort (car on a plus l'habitude de lire du texte espacé) de séparer les mots mentalement pour obtenir leur signification.

                      Au final, la syntaxe de la librairie standard du c++ et boost sont devenus une norme dans tous les projets de développement chez nous et on a gagné en lisibilité lors des relectures du code

                      • [^] # Re: Boost ? c'est quoi ?

                        Posté par (page perso) . Évalué à 2.

                        tu prêches un convaincu, la supériorité des underscores sur le camelcase est incontestable pour qui a un minimum de bon sens. Mais je pense sous l'influence des hordes de javaistes (et peut etre aussi de MS), la priorité a été donnée diverses variations de camelcase: tous les toolkits graphiques c++ l'utilisent, google l'utilise etc. Bref c'est un déchirement mais moi aussi finalement je m'y suis mis.

                        • [^] # Re: Boost ? c'est quoi ?

                          Posté par . Évalué à 3.

                          Je suis soufflé par la richesse de l'argumentation.

                          Du coup, ma réponse est évidente.

                          CamelCase c'est mieux parce que c'est mieux. CQFD.

                          • [^] # Re: Boost ? c'est quoi ?

                            Posté par (page perso) . Évalué à 2.

                            C'est une préférence évidement. D'ailleurs Herb Sutter considère (dans C++ Coding Standard, chez Addisson Wesley) qu'un développeur sérieux ne devrait pas faire du camel case une barrière à sa compréhension du code. Après tout, nous arrivons bien à séparer les syllabes sans camel case quand nous lisons un texte en langue humaine.

                            Ceci dit, je déteste le camel case, je le trouve beaucoup moins lisible que le traditionnel style standard.

                            • [^] # Re: Boost ? c'est quoi ?

                              Posté par . Évalué à 1.

                              Si Herb Sutter le dit alors ce doit être vrai! :D

                              Pas besoin d’être un gourou C++ pour le penser. Ou que tu ailles, tu dois respecter les conventions sous peines de problèmes, c'est valable aussi bien pour les conventions de codage ou conventions sociales. Va faire un doigt d'honneur a un policier français: pas de bol, la convention sociale t'interdit de le faire => "Outrage a agent" en France. Si tu ne respectes pas les conventions de codage, tu as une baisse de la lisibilité, ou d'autres conséquences plus fâcheuses (bugs, etc.).

                              • [^] # Re: Boost ? c'est quoi ?

                                Posté par (page perso) . Évalué à 2.

                                Il faut bien arriver à utiliser l'argument d'autorité de temps à autre :D

                                Ceci dit, lorsque les conventions sont mauvaises, il faut savoir les remettre en cause. Ça ne signifie pas de passer en force, mais d'en parler et d'argumenter le désir d'évolution.

                        • [^] # Re: Boost ? c'est quoi ?

                          Posté par . Évalué à 3.

                          sans_doute_parce_que_les_noms_de_fonctions_avec_des_underscores_finissent_par_faire_42k_carateres_de_long ?

                          Le camelCase incite plus a la compacité je trouve

                          • [^] # Re: Boost ? c'est quoi ?

                            Posté par (page perso) . Évalué à 3.

                            cEstVraiQueLeCamelCaseEmpecheTotalementDeFraireDesNomsEnormes

                            Pour relancer le troll, je dirais volontier que si le camelCase incite à limiter les noms de variable, c'est peut-être parce qu'il est illisible :D

                            Plus sérieusement, si un nom d'identifieur devient trop long, peut-être que la classe ou la fonction a un problème de conception ?

                      • [^] # Re: Boost ? c'est quoi ?

                        Posté par (page perso) . Évalué à 4.

                        déjà quand on tape, on gagne du temps si l'on utilise pas la complétion automatique car on n'a pas à appuyer sur shift pour utiliser des majuscules. On tape donc donc comme on écrit, vu que l'underscore est accessible sans combo clavier.

                        Uniquement en azerty français, pas en azerty belge, en qwertz ou en qwerty.

                        « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

                  • [^] # Re: Boost ? c'est quoi ?

                    Posté par (page perso) . Évalué à 2.

                    Qt vs STL ? c'est même pas comparable tellement Qt est supérieur ! Exemple pour QString : partage implicite, UTF-8, UTF-16, utilisation des regexp, toLower(), toUpper(), split(), QStringList, startsWith(), endsWith(), contains(), replace(), append(), remove(), fromNumber(), toNumber(), trim()...

                    Avec std::string tu dois tout te palucher et perdre ton temps à re-inventer le n-ieme splitstring ou remplacement de chaîne de caractères.

                    Que Qt suive le modèle de Schwartz ou celui de Planck, que le constructeur ne prenne pas des iterateurs, la sémantique de at() et [] ect..., c'est du blabla et on s'en fou. Ce que je vois c'est le résultat au quotidien : avec Qt ça marche, c'est simple, c'est agréable, je développe plus vite et mieux parceque Qt est très bien foutu, bien mieux que la STL.

                    • [^] # Re: Boost ? c'est quoi ?

                      Posté par (page perso) . Évalué à 1.

                      Le partage implicite et l'UTF-16, c'est déjà deux choses que je voudrais surtout pas dans le standard. Qu'on puisse avoir des strings UTF-16, très bien, mais que ça soit un défault, non merci. C'est surement intéressant pour certains domaines, mais dans beaucoup d'autres, c'est un surcoût inutile.

                      Concernant les algorithmes sur std::string, il est clair que la STL n'est pas très riche, même si une majorité s'écrivent sur une ligne(split() est un peu chiant) Par contre, rien n'empêche d'ajouter des algorithmes tout en utilisant std::string (ce que fait boost::string_algo et boost::regexp). Pour la majorité de ces traitements, la string n'est qu'un conteneur de caractères, et peut / doit être traité via l'interface standard iterator / range, les mêmes traitements pouvant donc être utilisé par d'autres interfaces (tel que QString par exemple)). (Toujours la différence entre objet et générique)

                      • [^] # Re: Boost ? c'est quoi ?

                        Posté par . Évalué à 1.

                        Qu'on puisse avoir des strings UTF-16, très bien, mais que ça soit un défault, non merci. C'est surement intéressant pour certains domaines, mais dans beaucoup d'autres, c'est un surcoût inutile. C'est un des aspects de la philosophie de la STL (et du C++ en général) qui me plait beaucoup : on ne paie pas pour ce que l'on n'utilise pas.

                        • [^] # Re: Boost ? c'est quoi ?

                          Posté par . Évalué à 3.

                          Oups, erreur formatage.

                          Qu'on puisse avoir des strings UTF-16, très bien, mais que ça soit un défault, non merci. C'est surement intéressant pour certains domaines, mais dans beaucoup d'autres, c'est un surcoût inutile.

                          C'est un des aspects de la philosophie de la STL (et du C++ en général) qui me plait beaucoup : on ne paie pas pour ce que l'on n'utilise pas.

                    • [^] # Re: Boost ? c'est quoi ?

                      Posté par (page perso) . Évalué à 5.

                      Avec std::string tu dois tout te palucher et perdre ton temps à re-inventer le n-ieme splitstring ou remplacement de chaîne de caractères.

                      Sauf si tu utilises boost!

                      http://devnewton.bci.im

                      • [^] # Re: Boost ? c'est quoi ?

                        Posté par (page perso) . Évalué à 3.

                        Le débat portait sur Qt vs STL :)

                        Donc comparons maintenant Qt vs Boost, split d'une string :

                        std::string str = "string to split"; std::vector<std::string> strs; boost::split(strs, str, boost::is_any_of(" "));

                        QString str = "string to split"; QStringList strs = str.split(" ");

                        "Joindre" des strings ensemble :

                        std::vector<std::string> list; list.push_back("Hello"); list.push_back("World!"); std::string joined = boost::algorithm::join(list, " ");

                        QStringList list; list << "Hello" << "World!"; QString joined = list.join(" ");

                        Je trouve la facon de faire plus logique, simple et lisible avec Qt.

                        • [^] # Re: Boost ? c'est quoi ?

                          Posté par . Évalué à 1.

                          En fait, ça ressemble énormément à du Python. J'ai bien envie de me mettre à Qt :-)

                          Article Quarante-Deux : Toute personne dépassant un kilomètre de haut doit quitter le Tribunal. -- Le Roi de Cœur

                        • [^] # Re: Boost ? c'est quoi ?

                          Posté par . Évalué à 3.

                          pas besoin de boost pour joindre des strings :

                          T container;
                          std::ostringstream oss;
                          std::copy(container.begin(), container.end(), std::ostream_iterator<T::value_type>(oss, " "));
                          std::string result = oss.str();
                          

                          avantage : ça marche pareil si T contient des nombres ou des classes. Va donc dire la même chose avec Qt.

                          • [^] # Re: Boost ? c'est quoi ?

                            Posté par (page perso) . Évalué à -1.

                            ça marche pareil si T contient des nombres ou des classes

                            Pas compris, ca t'arrive souvent de spliter des nombres et des classes ? tu peux donner un exemple

                            • [^] # Re: Boost ? c'est quoi ?

                              Posté par (page perso) . Évalué à 1.

                              En l'occurence, c'est pas un split, c'est un join :). Et ça va marcher pour tous ceux qui ont surchargé <<. Ça peut servir par exemple pour sérializer un ensemble de toto (ou ensemble est un conteneur quelconque et toto une classe quelconque implémentant <<).

                            • [^] # Re: Boost ? c'est quoi ?

                              Posté par . Évalué à 1.

                              Il ne s'agit pas ici de splitter mais de faire un join...
                              Donc oui, on peut vouloir faire un join de nombres et de classes si ils peuvent être transformer en chaine de caractère!

                          • [^] # Re: Boost ? c'est quoi ?

                            Posté par (page perso) . Évalué à 2.

                            Effectivement je crois pas que l'on puisse faire ca avec Qt. Boost/STL est effectivement plus puissant.

                            Y'a que moi pour trouver ce code imbitable ?

                            • [^] # Re: Boost ? c'est quoi ?

                              Posté par . Évalué à 1.

                              Il l'est le code C++ est vraiment trop verbeux, ça n'empêche que la grosse force du C++ reste les templates et la généricité que cela apporte, et normalement on se rend compte des erreurs à la compile.

                              Ceci dit, ce cas précis doit pouvoir se faire avec Q_DECLARE_METATYPE(T) et QVariant::toString() (pas testé). T devant dans ce cas implémenté QString T::toString(). Ceci dit en cas d'erreur on risque de le voir à l'éxecution et non à la compil (si T n'implémente pas toString, ça va surement compiler, mais au runtime QVariant::toString() renverra une chaine vide)

                        • [^] # Re: Boost ? c'est quoi ?

                          Posté par . Évalué à 4.

                          Le truc c'est que la façon de faire de Qt n'est pas exception safe. Ce qui fait que si une exception est générer à l'appel de split t'auras des fuites mémoires.
                          Avec la façon de faire de boost et de la stl en général, ton code est exception safe car le design à été pensé dans cette optique. C'est toute la différence, entre faire du code rapide a écrire et faire du code robuste. Entre les deux il faut choisir. Moi pour tout ce qui ne touche pas à l'interface j'ai depuis longtemps fait mon choix d'utiliser boost à cause des problèmes du aux exceptions et pour l'interface graphique et seulement elle d'utiliser Qt ou Gtkmm en fonction des besoins.

                          • [^] # Re: Boost ? c'est quoi ?

                            Posté par (page perso) . Évalué à 2.

                            si une exception est générer à l'appel de split t'auras des fuites mémoires

                            Et elle vient d'où cette exception ?

                            • [^] # Re: Boost ? c'est quoi ?

                              Posté par . Évalué à 5.

                              L'exception pourra se produire à la copie du paramètre retourné par split vu qu'il y a allocation mémoire et appel a un constructeur. La copie de QStringList n'aura pas ici d'influence si tu fais un catch car split ne modifie pas à priori l'état de l'objet qui l'appelle... mais pour d'autres méthodes dans Qt c'est le cas.
                              Exemple avec QQueue :

                              Si une exception est générée à l'appel de dequeue (au moment de la copie):

                              QQueue<QString> queue;
                              queue.enqueue("test");
                              QString test_string = queue.dequeue();

                              Et bien tu te retrouve dans un état irrecupérable car tu a perdu ta chaine de caractère. C'est un peu partout pareil dans Qt et j'ai pas le temps de débusquer toutes les erreurs de design.
                              Donc je ne l'utilise que pour l'interface graphique, pour le reste boost et la stl le font mieux.

                              • [^] # Re: Boost ? c'est quoi ?

                                Posté par (page perso) . Évalué à -1.

                                Prototype : T QQueue::dequeue()

                                Au moment de dequeue() 2 étapes sont effectuées :

                                1. copie de T pour pouvoir le retourner
                                2. suppression de T de la queue

                                Lors de l'étape 1 il y a un appel à l'operateur = de T (T::operator=())

                                Si l'operateur = lance une exception alors la copie ne se fait pas et T retourné par dequeue() est foireux.

                                Effectivement std::queue ne fonctionne pas ainsi et pop() (l'equivalent de dequeue()) ne retourne rien cf http://www.sgi.com/tech/stl/queue.html#3 ou les concepteurs de la STL expliquent les raisons.

                                Es dramatique ?

                                • Une exception a eu lieu, ta valeur est donc non garantie, je trouve rien de choquant a ca, c'est meme plutôt commun.

                                • Tu peux toujours utiliser QQueue de la meme façon que std::queue.

                                • AHMA les concepteurs de la STL ne détiennent pas LA vérité. Par exemple en C# Queue.Dequeue fonctionne de la meme façon que QQueue, pareil en Java.

                                Parler d'"erreurs de design" est clairement exagéré.

                                • [^] # Re: Boost ? c'est quoi ?

                                  Posté par (page perso) . Évalué à 3.

                                  C'est clairement une erreur de design.

                                  En fait tu n'as pas compris où le problème se situe. C'est lors de la restitution de la valeur extrait de la queue que l'exception peut être lancée. C'est un point où on ne peut rien faire, et où on va perdre en cohérence.

                                  Le but du mécanisme d'exception est de permettre la récupération d'une erreur en revenant dans l'état dans lequel on était avant la fonction qui a émis l'exception. Or ici, la fonction aura changé l'état de la queue lorsque l'exception pourra être lancée. L'état de la queue ne sera donc pas cohérente, une donnée aura été perdue.

                                  Si la queue contient des ressources qui doivent être désallouées après usage, on aura également une belle fuite de ressources (mémoire, mutex, etc). Il est vrai que ces ressources devraient être gérées en RIAA, bon, soit. Mais le problème reste entier, puisque la ressource sera libérée mais qu'elle n'aura pas été utilisée comme attendu. Ce qui peut être un bogue très difficile à détecter.

                                  • [^] # Re: Boost ? c'est quoi ?

                                    Posté par . Évalué à 2.

                                    RAII, pas RIAA.

                                    Pour "Ressource Acquisition Is Initialization", un paradigme de programmation dans lequel les ressources sont prises par un élément du programme en créant un objet. L'intérêt est que si une exception est lancée quelque part, les destructeurs des objets construits sur la pile seront appelés et donc les ressources libérées.

                                    • [^] # Re: Boost ? c'est quoi ?

                                      Posté par (page perso) . Évalué à 1.

                                      Oui bon, pardon, j'ai toujours du mal avec certains acronymes.

                                      D'ailleurs, à propos d'appel des destructeurs : il n'y a garanti de leur appel que si l'exception est attrapée. Si le programme avorte, le comportement est indéfini \o/

                                  • [^] # Re: Boost ? c'est quoi ?

                                    Posté par . Évalué à 1.

                                    l est vrai que ces ressources devraient être gérées en RIAA

                                    En RAII tu veux dire je pense. Je corrige pour les gens qui voudraient aller voir ce que c'est et qui tomberaient sur la Recording Industry Association of America en se demandant ce que ça vient faire ici.

                                    Étienne

                                • [^] # Re: Boost ? c'est quoi ?

                                  Posté par . Évalué à 0.

                                  Comme le dit lupus_mic tu n'as pas compris ou se générait l'exception. Tu as oublié un point dans tes étapes, donc voici le déroulement complet de l'exécution :

                                  1. copie de T pour pouvoir le retourner
                                  2. suppression de T de la queue
                                  3. copie de T au return <------ génération de l'exception

                                  L'étape 3 peut être optimisé par le compilateur qui évitera de faire une copie dans certains cas par exemple en cas d'inlining, mais ce n'est pas garanti. Ne jamais oublier qu'une copie au retour de paramètre peut soulever des exceptions.
                                  Savoir si une fonction est exception safe est important quand tu programme un truc qui doit être fiable (tourner sans planter plusieurs années sans être relancé).
                                  Je ne saurais trop te conseiller la lecture de cet article sur la réalisation des interfaces exceptions safe.
                                  De plus, sache qu'effectivement,les implémentation C#, Java ne sont pas exception safe. Ce qui pose un gros problème de robustesse. Cependant, pour faire du code robuste, on ne fait pas de c# ou du Java, c'est une question de bon sens, vu qu'il y a des bugs dans les implémentation des VM et des compilateurs JIT!

                                  • [^] # Re: Boost ? c'est quoi ?

                                    Posté par . Évalué à 3.

                                    Cependant, pour faire du code robuste, on ne fait pas de c# ou du Java, c'est une question de bon sens, vu qu'il y a des bugs dans les implémentation des VM et des compilateurs JIT!

                                    quel étrange argument. il y a des bugs dans les systèmes d'exploitation, dans les C runtime et autres librairies standards, et dans les compilateurs non-JIT

                                    on fait quoi maintenant ?

                                  • [^] # Re: Boost ? c'est quoi ?

                                    Posté par (page perso) . Évalué à 1.

                                    copie de T au return <------ génération de l'exception

                                    Effectivement, je ne suis pas un specialiste de ce genre de truc.

                                    C# et Java ne sont pas exception safe. Ce qui pose un gros problème de robustesse

                                    Néanmoins je pense toujours que "parler d'erreurs de design est exagéré". J'imagine que les developpeurs de Qt, C# et Java ont fait un choix en connaissance de cause. Ca ne conviendra pas a toutes les utilisations certes.

                                    Notons que quand on developpe en Qt, en general on n'utilise pas les exceptions car Qt ne les utilisent pas.

                        • [^] # Re: Boost ? c'est quoi ?

                          Posté par . Évalué à 6.

                          Le truc c'est que boost garde le principe de la stl, rester générique, là où Qt semble tendre vers l'écriture rapide du cas usuel (sur ces conteneurs).

                          Dernièrement ce que j'ai voulu c'était un

                          std::string str "string to split";
                          std::set< std::string > strs;
                          boost::split(strs, str, boost::is_any_of(" "));
                          pas de std::vector ici.

                          Et je suppose que je pourrais tout aussi bien faire un

                          std::string joind = boost::algorithm::join(strs, " ");
                          si jamais j'en ai la nécessité un jour.

                          Avec Qt il faut que j'attende que mon objet implémente une sortie vers mon conteneur (ou que je passe par des objets intermédiaires), avec la stl/boost, c'est mon conteneur qui doit respecter le contrat.

                          Les deux libs ne sont pas pensées pour les même cas d'utilisation.

                        • [^] # Re: Boost ? c'est quoi ?

                          Posté par (page perso) . Évalué à 2.

                          Dire que Qt explose boost/STL parce qu'on gagne une ligne sur un split, c'est assez peu significatif.

                          Compare plutôt asio et les sockets Qt, moc et signals2, les conteneurs Qt et multi_index, QConcurrent et thread...

                          http://devnewton.bci.im

                          • [^] # Re: Boost ? c'est quoi ?

                            Posté par . Évalué à 2.

                            Je t'avoue que depuis que j'ai découvert les multi-index de boost, je ne jure que part eux en lieu et place de la std::map et std::set car en général on veux gérer plusieurs index et pas qu'un seul.
                            C'est franchement le conteneur ultime.

                          • [^] # Re: Boost ? c'est quoi ?

                            Posté par (page perso) . Évalué à 2.

                            Dire que Qt explose boost/STL parce qu'on gagne une ligne sur un split, c'est assez peu significatif.

                            Merci de ne pas me faire dire ce que je n'ai pas dit !

                            Je me cite moi-meme : "Je trouve la facon de faire plus logique, simple et lisible avec Qt"

                  • [^] # Re: Boost ? c'est quoi ?

                    Posté par (page perso) . Évalué à 1.

                    De fait, QList ne se comporte pas comme une std::list , Qt a choisi une approche légèrement différente. De même qu'elle ne se comporte pas comme les listes java bien que pour les deux (std::list et liste java), des itérateurs existent qui reproduisent un comportement.

                    Tu as raison sur l'absence de constructeur acceptant des itérateurs, bien que ça semble pas trop difficile à rajouter, à coup de append(), ou sur la différence de sémantique des at().

                    Pour ce qui est de la performance Qt vs STL, je pense que ça dépend de chaque implémentation de la STL. En tout cas, si je dois convertir des noms de fichiers japonais (stockés en Shift-JIS) pour les afficher en UTF16, je sais lequel je choisirai: STL ne gère tout simplement pas les codecs, donc bonjour le bazar!

              • [^] # Re: Boost ? c'est quoi ?

                Posté par (page perso) . Évalué à 5.

                Pourquoi QString devrait hériter de std::string ? Ca n'a pas de sens, QString n'est pas un sur-ensemble de std::string , c'est un ensemble distinct. QString sait faire des choses que std::string ne sait pas faire, comme du partage implicite de la mémoire, des conversions dans différents types d'encodage (latin1, utf8, etc), du découpage en sous-chaînes. QString dispose d'optimisations spécifiques qui sont basées sur la manipulation brute des données de la chaîne, qui ne seraient pas possibles si QString en maitrisait pas la structure de donnée de stockage (en gros, si il utilisait std::string). De plus QString offre des garanties en terme de gestion de thread qui ne sont pas nécessairement offertes par std::string.

                Par contre, il est possible de convertir facilement une std::string en QString et vice-versa, d'utiliser des algorithme de la STL sur des QString, etc etc.

                • [^] # Re: Boost ? c'est quoi ?

                  Posté par . Évalué à 3.

                  std::string ne fait pas de partage implicite de la mémoire ? Alors change d'implémentation.

                  Et sinon, le principe des templates, c'est que quand le compilateur voit un template, il peut dérouler tout le code, voir tout le code inutile qu'il exécute et le foutre à la poubelle si on active les optimisations. C'est comme ça par exemple que les itérateurs de conteneurs comme std::vector ou std::string sont inlinés et souvent remplacés par des pointeurs dès qu'on passe en -O1.

              • [^] # Re: Boost ? c'est quoi ?

                Posté par (page perso) . Évalué à 2.

                std::string n'est pas dérivable publiquement. Comme tout les conteneurs de la STL, il n'ont pas été conçus pour être dérivables publiquement. La raison en est qu'ils ne disposent pas de fonctions virtuelles (tout le monde ne veut pas payer le coup de cet extra-pointer), et que du coup la dérivation publique n'a pas de sens (il n'est pas possible d'utiliser le polymorphisme).

      • [^] # Re: Boost ? c'est quoi ?

        Posté par (page perso) . Évalué à 6.

        L'objectif c'est de pouvoir utiliser des techniques récentes et sophistiquées sans faire évoluer le langage et sa norme.

        Et aussi un peu de se tirer sur la tige en faisant des constructions imbitables à coup pre-processor template proto meta programming , vous savez, quand chaque ligne de code génial fait brutalement instancier un quintillion de classes au compilo et lui prend plusieurs minutes à digerer (si la ram ne vient pas a manquer)

        • [^] # Re: Boost ? c'est quoi ?

          Posté par . Évalué à 3.

          Quand tu regarde leur code, oui c'est ignoble, mais pour l'utilisateur c'est vraiment agréable.

          Les logiciels sous licence GPL forcent leurs utilisateurs à respecter la GPL (et oui, l'eau, ça mouille).

        • [^] # Re: Boost ? c'est quoi ?

          Posté par . Évalué à 8.

          Il ne faut pas exagérer, il faudrai plus de consommation en RAM que ça pour que les développeurs java se sentent comme chez eux.

          (oui je sais, vendredi c'est demain.)

        • [^] # Re: Boost ? c'est quoi ?

          Posté par . Évalué à 4.

          C'est pas non plus de la complexité gratuite. Quand tu vois qu'ils ont réussi à coder Boost.Variant alors même que les templates variadiques n'existaient pas, c'est tout de même fortiche. Et leur code est fichtrement robuste.

    • [^] # Re: Boost ? c'est quoi ?

      Posté par . Évalué à 2.

      Je vois un argument non-technique et pourtant essentiel qui a été passé sous silence -- car, bon il faut être honnête, il y a du bon et du mauvais dans les divers frameworks/bibliothèques existants.

      Boost, c'est le labo du prochain standard. En gros, ce qui rejoint boost peut finir par être étudié pour rejoindre la prochaine norme du langage. C'est ce qu'il s'est passé avec plusieurs des sous-projets de boost : les pointeurs intelligents, les threads (dans une certaine mesure), bind et function, regex, etc. Qt ? GTK ? Ben ... Je me trompe peut-être, mais je n'ai pas vu de papiers émanant de chez eux pour proposer des évolutions dans le langage, ou ne serait-ce juste dans la SL. Alors, mieux ? Moins bien ? Peu importe, c'est ce qui se rapproche le plus du standard, ce qui capitalise le plus sur le standard. C++/Qt, c'est un peu comme C++/CLI, un truc langage différent avec ses idiomes qui lui sont propres. C++/SL+boost, c'est standard et valable partout (j'utilise même des morceaux de boost sur un fichu ARM avec l'archaïque gcc 2.95)

      Une bibliothèque pour les diriger toutes ? Oui, en quelque sorte.

  • # A propos de Spirit

    Posté par . Évalué à 8.

    Juste une petite remarque pour préciser que Spirit ne sert pas à "créer des compilateurs" mais des parsers (qui est une des brique d'un compilateur). Ce serait l'équivalent de Lex_et_yacc mais directement en C++.

    Étienne

  • # C++0x?

    Posté par (page perso) . Évalué à 9.

    Boost est une excellente bibliothèque, la trousse à outils du développeur C++, et je me bats quotidiennement pour remplacer nos vieux (et moches) utilitaires fait maison par du beau boost.

    Ceci dit, je me demande comment ils vont gérer la montée en charge de C++0x. De nombreuses bibliothèques du nouveau standard ont été prises de boost, mais parfois de manière incomplète. Ainsi, std::thread ne propose pas les pourtant bien utiles thread_group et shared_mutex.

    L'idéal serait qu'ils se mettent rapidement à utiliser les briques du standard quand elles sont disponibles, et construisent autour leurs outils haut niveau. En gros, que boost::thread_group construise des std::thread.

    Ah, et toujours pas de bibliothèque de log, snif...

    • [^] # Re: C++0x?

      Posté par . Évalué à 3.

      Ca m'étonnerais qu'il ne réutilisent pas autant que possible le standard.

      Les logiciels sous licence GPL forcent leurs utilisateurs à respecter la GPL (et oui, l'eau, ça mouille).

    • [^] # Re: C++0x?

      Posté par . Évalué à 2.

      Ah, et toujours pas de bibliothèque de log, snif...

      Boost.Log a été accepté, mais n'est pas encore intégré. Ca fait un an déjà ... Faut juste le récupérer à part et bidouiller un peu pour le builder.

  • # Equivalent en C

    Posté par . Évalué à 1.

    Existe-t-il quelque chose d'équivalent en C pour ceux qui ne peuvent/veulent pas faire du C++ ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.