Partage
  • Partager sur Facebook
  • Partager sur Twitter

classes de traits et spécialisation class template

classes de traits et spécialisation de class template (C++)

    17 novembre 2018 à 19:15:15

    Bonsoir OC,

    je reviens après avoir étudié la FAQ de developez.com sur les templates jusque la classe de politique. Je suis donc passé par les classes de traits notamment.

    https://cpp.developpez.com/faq/cpp/?page=Les-templates

    Et j'ai une question :

    dans l'exemple qui est donné sur la spécialisation de classe template , voici le code donné :

    template<typename T> 
    struct Modele  
    {  
        void QuiSuisJe()  
        {  
            std::cout << "Je suis un Modele<inconnu>" << std::endl;  
        }  
    };  
      
    template<> 
    struct Modele<int>  
    {  
        void QuiSuisJe()  
        {  
            std::cout << "Je suis un Modele<int>" << std::endl;  
        }  
     

    et voici l'exemple donné sur les classes de traits :

    template <typename T> struct ValeurNulle; 
      
    typename <> struct ValeurNulle<int>         {static int Zero()         {return 0;}}; 
    typename <> struct ValeurNulle<std::string> {static std::string Zero() {return "";}}; 
    typename <> struct ValeurNulle<MaClasse>    {static MaClasse Zero()    {return MaClasse(-1);}}; 
    // ... 
      
    template <typename T> 
    void Fonction(T Valeur) 
    { 
        T Ret = ValeurNulle<T>::Zero(); 
        // ... 
    }


    Question : La structure de code est très proche et la seule différence que je vois est que dans un cas, on utilise  template <> et dans la deuxième cas, on utilise typename<>

    D'ailleurs, dans la FAQ, cette notation typename<> apparaît pour la première fois pour les classes de traits, pas avant.

    Auriez-vous quelques explications pour cette ressemblance entre ces deux formes de code ?

    -
    Edité par pseudo-simple 17 novembre 2018 à 19:17:09

    • Partager sur Facebook
    • Partager sur Twitter
      17 novembre 2018 à 19:35:27

      Je crois qu'il s'agit d'une faute de frappe pour le deuxième code.
      • Partager sur Facebook
      • Partager sur Twitter

      Eug

        17 novembre 2018 à 23:25:31

        J'ai lu donc la partie que l'on m'a recommandé avant (Jeo_link_noir) sur les classes de traits. Cependant pour comprendre la page :

        https://en.cppreference.com/w/cpp/iterator/iterator_traits

        cela n'a pas été suffisant. 

        Par exemple , j'aurais besoin d'un exemple parlant pour la phrase :

        "This makes it possible to implement algorithms only in terms of iterators."

        De plus, dans l'exemple donné :

        j'aurais besoin de quelques commentaires pour le morceau de code :

        template<class BidirIt>
        void my_reverse(BidirIt first, BidirIt last)
        {
            typename std::iterator_traits<BidirIt>::difference_type n = std::distance(first, last);
            --n;
            while(n > 0) {
                typename std::iterator_traits<BidirIt>::value_type tmp = *first;
                *first++ = *--last;
                *last = tmp;
                n -= 2;
            }
        }

        Merci par avance pour votre aide

        • Partager sur Facebook
        • Partager sur Twitter
          18 novembre 2018 à 0:16:03

          YES, man a écrit:

          Par exemple , j'aurais besoin d'un exemple parlant pour la phrase :

          "This makes it possible to implement algorithms only in terms of iterators."

          voici un exemple:

          cppreferrence a écrit:

          template<class BidirIt>
          void my_reverse(BidirIt first, BidirIt last)
          {
              typename std::iterator_traits<BidirIt>::difference_type n = std::distance(first, last);
              --n;
              while(n > 0) {
                  typename std::iterator_traits<BidirIt>::value_type tmp = *first;
                  *first++ = *--last;
                  *last = tmp;
                  n -= 2;
              }
          } 
          Pour le reste:
          • de la ligne 6 à la ligne 11, c'est de l'algorithmique, il faut prendre quelque valeurs et tester soi-même pour comprendre comment ça marche
          • les lignes 4 et 7 sont des ilias de types defini dans la doc
          • Partager sur Facebook
          • Partager sur Twitter

          Eug

            18 novembre 2018 à 11:08:18

            Il me semble qu'il y a une autre faute dans le paragraphe : "À quoi sert le mot-clé typename ?"

            Merci de corriger la phrase :

            "Dans ce cas vous savez que T::MonType est bien un type, mais le compilateur lui ne peut pas le déduire. La....."

            Je pense que l'auteur a voulu dire :

            MaClasse<T>::MonType                                         

             Merci de me confirmer si c'est bien une coquille

            -
            Edité par pseudo-simple 18 novembre 2018 à 12:18:36

            • Partager sur Facebook
            • Partager sur Twitter

            classes de traits et spécialisation class template

            × 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