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

Langage C++ Discussion :

Class Template : variable membre de nom inconnu a priori ?


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 50
    Points : 56
    Points
    56
    Par défaut Class Template : variable membre de nom inconnu a priori ?
    Salut,

    Je cherche le moyen de faire une classe template ou je pourrai préciser le nom d'une variable de la classe qui servira de critère de trie uniquement lors de l'instanciation du template.

    Je m'explique par un exemple très simple :

    J'ai la classe A, qui est une classe ordinaire, elle comporte une variable membre nommé "toto", donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class A
    {
         public :
            int toto;
    }
    J'ai la classe B, qui est une classe ordinaire aussi, elle comporte une variable membre nommé "titi", donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class B
    {
         public :
            int titi;
    }
    J'ai une autre classe Tem, qui est une classe template:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <class T>class Tem  
    {
    public:
         FaitTrie();
         ....
    }
    Je voudrai que quand je crée un template en remplacant "T" par A, la méthode "FaitTrie" tienne compte de la variable "toto", mais quand je fais le template pour B, la même méthode tienne compte de "titi".

    Cela vous semble t 'il possible ? Ou est ce un cas impossible à faire en C++ (en Visual C++) ?

    Merci d'avance pour vos avis ou solutions


    [Balises CODE rajoutées par Loulou24, meci d'y penser à l'avenir]

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je pense que le mieux serait de spécifier un foncteur pour chaque classe (ou mieux si tu peux : l'opérateur <). Le tout étant d'avoir le même nom dans chaque classe qui sera paramètre template.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    class A
    {
    public :
     
       int titi;
       struct Sort
       {
          bool operator()(const A& a1, const A& a2) const {return a1.titi < a2.titi;}
       };
    };
     
    class B
    {
    public :
     
       int toto;
       struct Sort
       {
          bool operator()(const B& b1, const B& b2) const {return b1.toto < b2.toto;}
       };
    };
     
    template <class T> class Tem 
    {
    public :
     
          void FaitTrie()
          {
             // Utilise T::Sort pour trier les éléments
             // ou T::operator <() si tu peux le définir pour chaque classe
          }
         ....
    };
    Une autre variante : tu peux aussi faire une structure Sort globale qui soit template, et la spécialiser pour chaque classe (A, B, ...). Ta classe Tem utilisera alors Sort<T>::operator() (ou une autre fonction / opérateur, peu importe).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <class T> struct Sort {};
     
    template <> struct Sort<A>
    {
       bool operator ()(const A& a1, const A& a2) const {return a1.titi < a2.titi;}
    };
     
    template <> struct Sort<B>
    {
       bool operator ()(const B& b1, const B& b2) const {return b1.toto < b2.toto;}
    };
    L'inconvénient ici est que Sort<T> devra sûrement être ami de T.

  3. #3
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Si tu n'as pas accès aux classes A et B (ou si tu considère ques ces infos de tri n'en font pas conceptuellement partie), tu peux aussi utiliser une classe de traits :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<class T> Tem_traits
    {
      static bool compare(T const &t1, T const &t2) {return t1<t2;}
    };
     
    template<> Tem_traits<A>
    {
      static bool compare()(A const &a1, A const &a2) {return a1.toto < a2.toto;}
    };
     
    // Idem pour B
    Et dans FaitTrie, tu utilises simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tem_traits<T>::compare (t1, t2);

  4. #4
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut Re: Class Template : variable membre de nom inconnu a priori
    Salut
    Ton pb est classique losque l'on veux utiliser toute la puissance de la STL sur ses propres classes, pour pouvoir faire du tri, il faut definir les opérateur == et <
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A
    {
         public :
            int toto;
            bool operator==(const A& a) { return toto==a.toto; }
            bool operator<(const A& a)  { return toto<a.toto; }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class B
    {
         public :
            int titi;
            bool operator==(const B& b) { return titi==b.titi; }
            bool operator<(const B& b)  { return titi<b.titi; }
    }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    Salut,

    Effectivement définir les opérateurs résoud mon problème.

    Merci pour l'aide

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Seul l'opérateur < est requis (pour ce qui est de la STL en tout cas). Tous les autres peuvent s'en déduire.

  7. #7
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par Loulou24
    Seul l'opérateur < est requis (pour ce qui est de la STL en tout cas). Tous les autres peuvent s'en déduire.
    Oui, pour faire du trie avec la STL on a besoin que le l'opérateur <.
    Pour les autres opérateus il existe des fonctions templates dans <utility> (fichier à inclure).
    L'opérateur != est construit à partir de ==
    Les opérateurs >, <=, >= sont construits à partir de <

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename T>
    bool operator>(const T& left, const T& right)
    {
        return right < left;
    }

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/07/2007, 14h47
  2. Réponses: 7
    Dernier message: 22/02/2007, 16h57
  3. [POO] Classe abstraite PHP5 et variables membres
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 07/06/2006, 01h27
  4. variable contenant le nom d'une methode d'une classe
    Par s1pike dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/05/2006, 13h48
  5. Problèmes de fonctions membres de classe templates, gcc3.3.6
    Par yves.dessertine dans le forum Autres éditeurs
    Réponses: 12
    Dernier message: 17/10/2005, 21h36

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