Partage
  • Partager sur Facebook
  • Partager sur Twitter

Auto-déduction de non-type-template-param (double)

depuis un litéral [C++20]

    11 avril 2021 à 18:11:53

    Ce sujet https://openclassrooms.com/forum/sujet/c-20-concept-pour-tester-si-un-nombre-est-nul et une conf sur le C++20, qui m'a fait percuté que l'on pouvait utiliser des paramètres templates de type double, m'ont inspiré pour reprendre  un vieux POC en C++20 (https://openclassrooms.com/forum/sujet/types-opaques-domaines-de-definitions)

    Chouette. Je tente, le résultat n'est pas si mal: https://godbolt.org/z/GWvsxW44P mais... il manque encore un truc histoire que cela ne soit pas trop compliqué à manipuler: je voudrais pouvoir convertir implicitement un littéral en `domain::set<decltype(litteral), littéral, littéral>`. Dit autrement, comment faire que `domain::set{42.5}` serve à construire automatiquement un `domain::set<double, 42.5, 42.5>`.

    J'ai l'impression que les règles de CTAD ne s'appliquent pas sur les non-type-template-parameters (NTTP). J'ai tenté des choses comme

    template <typename T, auto min_, auto max_>
    struct set
    {
        constexpr explicit set(T value_) noexcept : m_value(value_)
        {
            assert(can_contain(value_));
        }
    
        // N'a pas l'air utilisé
        constexpr explicit set(T value) -> set<value, value>;
    ....
    
    
    // Ou encore
    };
    
    template <typename T>
    set(T value) -> set<T, value, value>;
    
    template <typename T>
    consteval auto as_set(T value) {
        return set<T, value, value>{value};
    }
    

    Est-ce que ce n'est pas permis (voire pas implémenté (*)) ? Ou alors il faut s'y prendre autrement.

    NB: Je vois bien des solutions à base de User Defined Litterals où 42._c serait du bon type, mais j'aimerai quelque chose de plus simple pour l'utilisateur final.

    (*) Pour l'instant ni clang11, ni GCC 10 ne supporte les NTTP de type flottants. D'où que je partage le code directement sur godbolt.

    -
    Edité par lmghs 11 avril 2021 à 18:13:35

    • Partager sur Facebook
    • Partager sur Twitter
    C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
      11 avril 2021 à 20:21:19

      Comme les paramètres ne sont jamais des valeurs constexpr, il n'est pas possible de propager une valeur de construction en paramètre template sans UDL ou autres magouilles. Pour le moment, toutes les propositions qui vont dans le sens de paramètre constepxr sont rejetées au profil de choses bancales comme std::is_constant_evaluated...

      Par contre, tu peux transformer domain::set<T, auto min, auto max> en domain::set<auto min, auto max = min> pour ainsi faire domain::set<42.5>. Mais à moins de le forcer dans ce cas de figure, il faudra toujours indiquer le paramètre lors de la construction.

      Une autre manière serait de passer par une fonction template<auto min_max> qui s'occupe cette construction.

      Dans tous les cas, il n'y a ma connaissance aucun moyen d'avoir une syntaxe uniforme pour déduire un type depuis des valeurs.

      • Partager sur Facebook
      • Partager sur Twitter
        12 avril 2021 à 12:01:37

        OK. Merci. Je craignais un peu cela.  Je vais voir jusqu'où je peux aller avec cette idée.
        • Partager sur Facebook
        • Partager sur Twitter
        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

        Auto-déduction de non-type-template-param (double)

        × 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