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 :

Hériter d'une classe template non définie


Sujet :

Langage C++

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut Hériter d'une classe template non définie
    Bonjour

    Je souhaiterai savoir si il est possible de faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    class C : public T
    {
    ...
    };
    et même mieux (si possible) : s'assurer que T dérive bien d'une classe donnée. Je fonctionne aujourd'hui avec un define qui permet de créer la classe, mais je me demandais si je pouvais troquer ce define contre un template...
    Jérémie

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Normalement, tu peux le faire... Cela s'apparente à du CRTP

    Et cela peut mener à quelques trucs sympa, du genre de
    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
    template<class T>
    class C
    {
        public:
            C(T const & v):val(v){}
            void print()const
            {
                cout<<"I'm a C and my value is "<<val<<endl;
            }
            T const & value() const{return val;}
        private:
            T val;
    };
    template <class T>
    class C2 : public T
    {
        public:
            C2( T const & t):T(t){}
            void otherPrint()const
            {
                cout<<"I'm a C2 and my C value is "
                    <<this->value()<<endl;
            }
    };
    int main()
    {
        C2<C<int> > c(2); // (*)
        c.print();
        c.otherPrint();
        C2<C<std::string> > s(std::string("Hello"));
        s.print();
        return 0;
    }
    (*) Pour l'instant, il faut "juste" veiller à bien laisser un espace entre deux > lorsque l'on ferme la liste des types paramétrés, pour éviter que le compilateur ne confonde la fermeture avec l'opérateur >> (appliqués sur les i*stream ou comme décalage de bits)...

    Dans la prochaine norme, ce problème est normalement résolut
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Aucun problème pour hériter d'un paramètre classe générique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    class C : public T
    {
    ...
    };
    Pour vérifier que T dérive bien d'une classe donnée, le plus simple est d'utiliser Boost.Type Trait et Boost.Static assert, ou si tu as un compilateur C++0x, ces deux fonctions peuvent y être intégrer de base.
    Si tu es allergique à Boost, Visual propose __is_base_of mais ce n'est pas standard.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    J'en oubliais le dernier point qui consiste à vérifier si le type sélectionné dérive d'une classe donnée...

    Il y a, normalement, moyen de faire cette vérification de manière statique (comprend: à la compilation), mais elle met en oeuvre une série de trait de politiques qu'il serait fort long de détailler ici (ou du moins que je n'ai pas le courage de détailler ici)...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut
    Merci pour ces réponses.
    en fait je peinais car il faut mettre this-> pour pouvoir acces à une méthode de la classe parente, sinon, ça ne compile pas.
    Jérémie

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par jfouche Voir le message
    Merci pour ces réponses.
    en fait je peinais car il faut mettre this-> pour pouvoir acces à une méthode de la classe parente, sinon, ça ne compile pas.
    Oui, c'est effectivement l'un des rares cas (pour ne pas dire le seul) dans lequel l'utilisation de this-> est requise...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Aucun problème pour hériter d'un paramètre classe générique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    class C : public T
    {
    ...
    };
    Pour vérifier que T dérive bien d'une classe donnée, le plus simple est d'utiliser Boost.Type Trait et Boost.Static assert, ou si tu as un compilateur C++0x, ces deux fonctions peuvent y être intégrer de base.
    Si tu es allergique à Boost, Visual propose __is_base_of mais ce n'est pas standard.
    VC++ et gcc proposent std::tr1::is_base_of<_Base,_Derived> dans <type_traits>, qui sont déjà plus standard (et qui bougent dans std pour le prochain standard).

    Et si tu ne souhaite pas utiliser le TR1, Réimplémenter is_base_of<> est "relativement simple" - cf Etude du C++ Technical Report 1 - type_traits sur mon blog.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  8. #8
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par jfouche Voir le message
    Merci pour ces réponses.
    en fait je peinais car il faut mettre this-> pour pouvoir acces à une méthode de la classe parente, sinon, ça ne compile pas.
    Tu peux aussi utiliser using... (je crois que le débat continue sur ce qui est bon ou non..)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/08/2012, 21h05
  2. Réponses: 2
    Dernier message: 06/03/2009, 09h52
  3. Réponses: 8
    Dernier message: 20/07/2007, 14h28
  4. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48
  5. Réponses: 7
    Dernier message: 25/03/2005, 14h05

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