Partage
  • Partager sur Facebook
  • Partager sur Twitter

Syntaxe du c++ moderne.

Trop transparente je trouve.

    6 juin 2021 à 1:59:14

    Casse tête la méta programmation en c++ difficile de savoir ce que le code va générer comme code par exemple template<class C> struct unpack { template <typename seq, typename... XS> using f = unpack<seq>::template f<C,XS...>; si on a unpack<typelist<int, double, std::string>> ça va générer typelist<int, double, std::string>::typelist<std::string, double, int> si je comprend bien parce que unpack<typelist<int, double, std::string>> c'est typelist<int, double, std::string> et f c'est typelist<typelist<int, double, std::string>> qu'il déroule en typelist<typelist<double, std::string>, int> qu'il déroule en typelist<typelist<std::string>, double, int> qu'il déroule en typelist<std::string, double, int> ce qui donne la liste à l'envers mais comment savoir que le premier paramètre C va prendre la valeur de typelist <double, std::string> et que le premier élément va être extrait, puis le deuxième puis le troisième, pas clair cette syntaxe!!! Je hais le c++ moderne n'y a t'il pas moyen  faire comme on fait avec les variables c'est à dire un truc du genre fonctions using f = { using typelist = C; for (unsigned int i=0;i<typelist.size();i++){ typelist.push_front(typelist[i]);} return typelist;} ça aurait été beaucoup moins casse tête !!! Là j'ai carrément envie de créer un language de script parce que c'est vraiment trop casse gueule c'est difficile de savoir quel sera le code que le compilateur va générer et si il y a des classes conditionnelles c'est pire encore par exemple imaginons le cas où je dois récupérer tout les types qui sont des placeholders, les trier et éliminer les doublons je ferais quelque chose du genre using placeholders={for (unsigned int i=0;i<sizeof...(args);i++){ if(args[i].find(placeholders)){bool contains = false; for (unsigned int j=0;j<sorted.size()&&!contains;j++) {  if(args[i]==contains[j]){contains=true;} }if(!contains){template<size_t, typename t> pl= args[i]; sorted[pl::index] = args[i]; } return sorted; je pense que ça serait bien que je crée un programme qui fasse un truc du genre parce que avec la syntaxe du c++ moderne, je ne saurai vraiment pas le faire.

    • Partager sur Facebook
    • Partager sur Twitter
      6 juin 2021 à 2:49:19

      Ton message est illisible, sans la mise en forme du code.

      Et sinon, le code généré est complètement prévisible, si ce code est valide.

      -
      Edité par gbdivers 6 juin 2021 à 2:50:34

      • Partager sur Facebook
      • Partager sur Twitter
        6 juin 2021 à 4:27:16

        Je n'en suis pas rendu là mais je pense qu'on peut prédire son code s'il est bien pensé.
        Pour la syntaxe du C++ moderne, j'ai déjà dit que les entrées-sorties formatées n'étaient pas super:
        std::cout << ... << std::endl;
        Si on veut faire du format fixe comme en C (ou en Cobol ...) ce n'est pas évident:
        printf("%04d\n", variable);
        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          6 juin 2021 à 5:28:24

          Ce que tu critiques n'as rien à voir le C++ moderne, mais la lourdeur d'écriture de méta-programmation basée sur les types (à confronter avec celle basée sur les valeurs et constexpr qui n'est pas toujours mieux).

          Les normes des dernières années ont apportées énormément: alias template, variadiques et fold expression. Mais ce n'est pas suffisant pour éliminer toute la complexité. Moi j'attends http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1858r1.html

          La manipulation de type à travers des boucles c'est de la réflexion: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2019/p1240r1.pdf qui si tout se passe bien arrivera en C++23 avec peut-être les méta-classes qui sont basées dessus.

          À part ça, le code que tu montres n'est pas valide et il n'y a pas de boucle de boucle de etc ou d'appel résursive dans unpack.

          • Partager sur Facebook
          • Partager sur Twitter
            6 juin 2021 à 10:12:55

            jo_link_noir a écrit:

            Ce que tu critiques n'as rien à voir le C++ moderne, mais la lourdeur d'écriture de méta-programmation basée sur les types (à confronter avec celle basée sur les valeurs et constexpr qui n'est pas toujours mieux).

            Les normes des dernières années ont apportées énormément: alias template, variadiques et fold expression. Mais ce n'est pas suffisant pour éliminer toute la complexité. Moi j'attends http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1858r1.html

            La manipulation de type à travers des boucles c'est de la réflexion: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2019/p1240r1.pdf qui si tout se passe bien arrivera en C++23 avec peut-être les méta-classes qui sont basées dessus.

            À part ça, le code que tu montres n'est pas valide et il n'y a pas de boucle de boucle de etc ou d'appel résursive dans unpack.


            Ca à l'air plus cool la nouvelle syntaxe moi j'attend avec impatience de pouvoir faire ceci !

            https://openclassrooms.com/forum/sujet/cppss-cpp-syntax-simplifier-recrute#94130103

            Avec mon nouveau projet.

            -
            Edité par OmbreNoire 6 juin 2021 à 14:45:19

            • Partager sur Facebook
            • Partager sur Twitter

            Syntaxe du c++ moderne.

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown