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éritage et Spécialisation Template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 46
    Par défaut Héritage et Spécialisation Template
    Bonjour a tous j'ai (encore) une question:

    J'ai une classe ClovisVariable et plusieurs autre classe qui héritent de celle-ci : CString CFloat CInteger ...

    J'ai crée une Class Node dont j'ai spécialisé une fonction. voici un bref résumé.

    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
     
    template <class T>
    Class Node{
     
      public:
         Node();
         void getPath();
     
    } 
     
    template <class T>
    T * Node<T>::getPath(){
         std::cout << "Type Inconnu" << std::endl;
         return NULL;
    }
     
    Node<ClovisVariable> * Node<ClovisVariable>::getPath(CString name){
        std::cout << "clovis variable" << std::endl;
        return NULL;
    }
    Donc quand je fais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Node<CString> * j = new Node<CString>();
    j->getPath();
    Il m'affiche type inconnu alors que j'aimerai qu'il m'affiche Clovis Variable

    Je ne sais pas quoi faire pour que quand je mets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Node<CString> * j = new Node<CString>();
    Node<CInteger> * i = new Node<CInteger>();
    Node<CFloat> * k = new Node<CFLoat>();
    a chaque fois que je fais appel à la fonction getPath() il m'affiche Clovis Variable.

    Quelqu'un peut il m'eclairer de ses lumières?

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Si je me rappelle bien, ce n'est pas possible.
    Avec les spécialisation c'est exactitude totale ou rien.

    Je crois savoir que ce sujet à déjà été traité (cas très similaire). Il faut que je recherche pour confirmer.

    Edit: 3 solutions :
    -cast.C'est assez simple, mais c'est moche.

    example :
    (code fait par adema)
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include <iostream>
     
    class ClovisVariable
    {
    };
     
    class CInteger : public ClovisVariable
    {
    };
     
    class CString : public ClovisVariable
    {
    };
     
    class CFloat : public ClovisVariable
    {
    };
     
    template <class T>
    class Node
    {
    	public:
    		void getPath(T);
    };
     
    template <class T>
    void Node<T>::getPath(T name)
    {
    	std::cout << "Type Inconnu" << std::endl;
    }
     
    template <>
    void Node<ClovisVariable>::getPath(ClovisVariable name)
    {
    	std::cout << "clovis variable" << std::endl;
    }
     
    typedef Node<ClovisVariable> NodeClovis;
     
    int main(void)
    {
    	CString i_string;
    	Node<ClovisVariable> * i_node = new Node<ClovisVariable>();
    	i_node->getPath(static_cast<ClovisVariable>(i_string));
     
    	CInteger j_integer;
    	Node<ClovisVariable> * j_node = new Node<ClovisVariable>();
    	j_node->getPath(static_cast<ClovisVariable>(j_integer));
     
    	CFloat k_float;
    	Node<ClovisVariable> * k_node = new Node<ClovisVariable>();
    	k_node->getPath(static_cast<ClovisVariable>(k_float));
     
           delete i_node;
            delete j_node
    delete k_node;
    	return 0;
    }
    Spécialisation "à la main"
    Si le nombre de type est petit, on expliciter toutes les spécialisation.

    Spécialisation "automatique"
    La on sort la grosse artillerie: la métaprogrammation
    Voici un code non testé qui résume mon idée:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    #include <iostream>
     
    class ClovisVariable
    {
    };
     
    class CInteger : public ClovisVariable
    {
    };
     
    class CString : public ClovisVariable
    {
    };
     
    class CFloat : public ClovisVariable
    {
    };
     
    template <class H, class SousListe> struct ListeType {};
    struct ListeFin {};
     
    template <class T> class Node;
     
    template <class H,class SousListe> class Node< ListeType<H, SousListe> > : public Node<SousListe>
    {
    public:
        H* getPath(const H& h)
        {
                 std::cout << "Type Connu : Clovis" << std::endl;
                 return NULL;
        }
    };
     
    // Spécialisation pour le type de fin de liste
    // C'est la super-classe
    template <> class Node< ListeFin > 
    {
    public:
     
        template <class Z> Z* getPath(const Z& z)
        {
                 std::cout << "Type Inconnu" << std::endl;
                 return NULL;
        }
    };
     
    typedef ListeType<ClovisVariable, ListeType<CInteger, ListeType<CFloat, ListeType<CString, ListeFin> > > > UneListeClasses;
     
    int main()
    {
    int i;
    	CString i_string;
    	Node<UneListeClasses> * i_node = new Node<UneListeClasses>();
    	i_node->getPath(i_string);
     
    	CInteger j_integer;
    	Node<UneListeClasses> * j_node = new Node<UneListeClasses>();
    	j_node->getPath(j_integer);
     
    	CFloat k_float;
    	Node<UneListeClasses> * k_node = new Node<UneListeClasses>();
    	k_node->getPath(i);
     
            delete i_node;
            delete j_node
    delete k_node;
     
    	return 0;
    }
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

Discussions similaires

  1. [template]Héritage d'une Template par une Classe
    Par koni33 dans le forum Langage
    Réponses: 0
    Dernier message: 11/05/2008, 14h12
  2. Spécialisation template qui n'est jamais appelée
    Par coyotte507 dans le forum Langage
    Réponses: 4
    Dernier message: 02/05/2008, 12h39
  3. Spécialisation template et définition multiple
    Par loman02 dans le forum Langage
    Réponses: 10
    Dernier message: 23/04/2008, 13h48
  4. Héritage de classe template
    Par FunkyTech dans le forum Langage
    Réponses: 2
    Dernier message: 06/02/2008, 19h07
  5. probleme spécialisation template
    Par babar63 dans le forum Langage
    Réponses: 23
    Dernier message: 30/10/2007, 14h42

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