IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Comment utiliser les traits?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut Comment utiliser les traits?
    Salut!

    J'ai entendu parler de la notion de traits dans plusieurs cours et tutoriels (notamment le MegaCour sur le site) mais je n'ai pas trouvé d'exemples concrets.

    A ce que j'ai compris les traits sont des classes contenants des methodes reutilisables par d'autres classes.
    Mais comment les déclarer et indiquer dans une classe que l'on va utiliser tel ou tel trait?

    Merci de m'éclairer!

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    C'est difficile sans exemple précis de t'aider. On peut considérer std::numeric_limits comme une classe de traits asociée aux types entiers. Peut-être que regarder cet exemple t'éclairera ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Numeric_limits est donc un trait?

    Un exemple concret:
    j'ai une classe template:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<class T>
    class nombre{
          T a;
          T b;
          };
    j'en fait 2 instances:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nombre<int> nombre_entier;
    nombre<float> nombre_float;
    Maintenant je voudrait définir une methode print qui affiche a et b et qui est commune aux deux classes déclarées:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void print(){
                 cout<<a<<endl;
                 cout<<b<<endl;
                 }
    Comment la définir dans une classe de trait et faire en sorte qu'elle soit utilisée par les deux premieres?

    Merci pour toutes vos contributions.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Il n'y a pas besoins de traits pour ça, il suffit d'ajouter la gestion de l'opérateur<< dans ton template.

    Souvent, les traits servent à ajouter des informations à un type, quand on peut pas modifier celui ci (type de base, ou type fourni par une bibliothèque fournie par un tiers).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Citation Envoyé par JolyLoic
    Il n'y a pas besoins de traits pour ça, il suffit d'ajouter la gestion de l'opérateur<< dans ton template.
    Je suis d'accord mais juste pour savoir comment faire!

    Merci pour ces précisions je voit mieux quand les utiliser et c'est vrai que cet exemple n'est pas vraiment approprié mais c'est juste pour apprendre le principe et voir la syntaxe.

  6. #6
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Evitez d'utilisez les mots anglais comme ça... C'est ridicule lol. Moi on me dit trait j'pense à un trait au crayon !

    D'ailleurs en français, c'est... Caractéristique ?

    Sinon les "traits classes" sont beaucoup utilisées dans boost, tu peux peut-être jeter un coup d'oeil aussi.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Un trait c'est une classe dont toute l'utilité est disponible sans
    l'instancier ni la dériver. On utiliserait vraissemblablement des
    namespace plutôt que des classes si un namespace pouvait avoir des
    paramètres template et être un paramètre template.

    Bien que les traits puissent être utiles en dehors des templates, c'est
    surtout en conjonction avec ceux-ci qu'ils servent.

    Commençons par un template avec beaucoup de paramètres:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename T, T min, T max> f() {... min ... max}
    Si la valeur passées pour une série de ces paramètres sont souvent liées,
    on peut gagner de la clarté en les regroupant dans un type et en passant
    plutôt ce type (exactement comme on peut gagner de la clarté en regroupant
    des paramètres et en passant une structure):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename T, typename Limits> f() {... Limit::min ... Limit::max ...}
    S'il y a des valeurs par défaut adéquate, on peut les fournir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename T, typename MyLimits = Limits<T> > f() 
    {... MyLimits::min ... MyLimits::max ...}
    Ou si c'est vraiment toujours les mêmes valeurs, on peut même éviter de les
    passer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename T> f() 
    {... Limits<T>::min ... Limits<T>::max ...}
    Je reprends ton exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<class T>
    class nombre{
       T a;
       T b;
    public:
       friend std::ostream& operator<<(std::ostream&, nombre);
    };
    où tu cherches à définir l'opérateur en permettant de controler l'affichage.

    On va définir une classe trait donnant un défaut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <typename T>
    struct afficheur {
       static void print(std::ostream& os, T const& v) {
          os << v;
       }
    };
    On ajoute un paramètre à ta classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<class T, typename aff = afficheur<T> >
    et on l'utilise dans l'operateur<<:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    friend std::ostream& operator<<(std::ostream& os, nombre const& n) {
       os << '(';
       aff::print(os, n.a);
       os << ", ";
       aff::print(os, n.b);
       os << ')';
       return os;
    }
    A noter qu'il y a une intersection entre les policy et les traits.

  8. #8
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Merci pour toute ces informations et exemples!

    Mais on n'est pas obligé de définir l'opérateur <<?

    On pourrait pas utiliser directement "print" comme une méthode:
    renverrait a et b?

  9. #9
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    On ajoute un paramètre à ta classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template<class T, typename aff = afficheur<T> >
    C'est pas vraiment le sujet mais le compilo, Dev-C++, aime pas le "<T> >":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    18 C:\DOCUME~1\PROPRI~1\Bureau\main.cpp spurious `>>', use `>' to terminate a template argument list 
    18 C:\DOCUME~1\PROPRI~1\Bureau\main.cpp expected identifier 
    18 C:\DOCUME~1\PROPRI~1\Bureau\main.cpp expected `>'

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Jean-Marc a bien pris soin de taper > > avec un espace entre les deux, ton message d'erreur laisse penser que tu as tappé >> dans espace, ce qui fait que >> est interprété comme l'opérateur >>, et non comme deux > d'affilé...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    J'ai déja essayé avec un espace et il m'a indiqué une erreur de type:
    "il manque un >"

    Bon finalement j'ai modifié quelques trucs et j'ai recompilé et c'est bon!

  12. #12
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    J'y voit beaucoup plus clair maintenant.

    Merci a tous!

    Je note le probleme

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [HTTP] Comment utiliser les POST par programation
    Par Popof dans le forum Général Conception Web
    Réponses: 9
    Dernier message: 31/01/2005, 09h14
  2. Réponses: 4
    Dernier message: 13/12/2004, 20h37
  3. [COM] Comment utiliser les événements Word ?
    Par Laurent Dardenne dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 30/05/2004, 12h38
  4. Réponses: 11
    Dernier message: 22/12/2003, 21h06
  5. Comment utiliser les styles XP avec Dev-C++?
    Par abraxas dans le forum Dev-C++
    Réponses: 3
    Dernier message: 05/10/2003, 19h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo