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 :

templates et polymorphisme


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut templates et polymorphisme
    Bonjour à tous,

    Voilà mon souci du moment :

    J'ai une interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class IProperty
    {
    public:
        virtual std::string ToString() = 0;
    };
    Puis qui en hérite une propriété conrête, templarisée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template<class T>
    class CProperty
    {
    typedef T value_type;
     
    public:
        virtual std::string ToString();
    private:
       T m_tValue;
    };
    Ce qui me dérange, c'est que lorsque je dois comparer deux "IProperty", je ne peux pas savoir si je peux comparer les types encapsules entre eux ou devoir passer par la conversion en chaîne de caractères...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    IProperty& lProperty = CProperty<long>(10);
    IProperty& strProperty = CProperty<std::string>("10");
    lProperty == strProperty; // On passe par les "ToString()", ok
     
    IProperty& lProperty2 = 20;
    lProperty2 == lProperty1; // On passe toujours par les ToString mais j'aimerai passer par la comparaison entre "long" pour gain de perfs
    Comment je peux résoudre le problème ? Est-t-il possible de mettre une fonction virtuelle pure qui renvoi non pas une valeur, une référence ou un pointeur mais un type afin de les passer à une structure Trait qui les comparera ?


    Merci beaucoup,

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Typiquement, pour ça, on passe par des traits et une valeur retournée.
    Le problème, c'est que ça restreint à un sous-ensemble de types (généralement, les types primitifs + un ou deux types "pointeur", sachant qu'on peut considérer std::string comme primitif dans le cas présent).

    Voir aussi boost::variant, qui pourrait t'aider de ce côté-ci.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci pour ta réponse.

    Est-ce que tu peux me donner un bout de code avec la solution des traits ? car j'ai essayé sans succès :'(


    Merci
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Typiquement, les traits donnent un truc de ce genre:
    Code C++ : 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 <string>
     
    enum PropertyType
    {
    	PropertyInt16,
    	PropertyInt32,
    	PropertyChar,
    	PropertyString,
    	PropertySingleFloat,
    	PropertyDoubleFloat,
    	PropertyPointer
    };
     
    template< class T > struct PropertyTypeTraits { };
     
    template<> struct PropertyTypeTraits<short>
    {
    	enum TypeValues { TypeValue = PropertyInt16 };
    };
     
    template<> struct PropertyTypeTraits<int>
    {
    	enum TypeValues { TypeValue = PropertyInt32 };
    };
     
    template<> struct PropertyTypeTraits<long>
    {
    	enum TypeValues { TypeValue = PropertyInt32 };
    };
     
    template<> struct PropertyTypeTraits<std::string>
    {
    	enum TypeValues { TypeValue = PropertyString };
    };
     
    //Spécialisation partielle pour les pointeurs
    template<class T> struct PropertyTypeTraits<T*>
    {
    	enum TypeValues { TypeValue = PropertyPointer };
    };
     
    class IProperty
    {
    public:
    	virtual PropertyType GetPropertyType() = 0;
    	virtual std::string ToString() = 0;
    };
     
    template<class T>
    class CProperty
    {
    typedef T value_type;
     
    public:
    	virtual PropertyType GetPropertyType()
    	{
    		return static_cast< PropertyType >( PropertyTypeTraits< T >::TypeValue );
    	}
    	virtual std::string ToString();
    private:
    	T m_tValue;
    };
     
    void TestTemplate3(void)
    {
    	CProperty< int > prop;
    	PropertyType type = prop.GetPropertyType();
     
    	(void)type;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci beaucoup

    Je test ça de suite
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Pas besoin de faire des choses aussi verbeuses et surtout aussi fixes.
    Si typeid(lProperty) == typeid(lProperty1), alors c'est le même type.
    Boost ftw

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ah, merci Loufoque. J'oublie toujours la RTTI en C++, et surtout s'il est question de la mêler aux templates...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    CProperty n'hérite pas de IProperty ? Je pensais que c'était une coquille.
    Ça n'a rien à voir avec les templates.
    Boost ftw

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je pense que c'est une coquille.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Bah si si, CProperty hérite de IProperty.

    J'ai utilisé le typeid finalement, ça fonctionne bien.


    Merci
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

Discussions similaires

  1. probleme template et polymorphisme
    Par thenewby dans le forum Langage
    Réponses: 9
    Dernier message: 16/07/2012, 16h48
  2. Template et Polymorphisme = contrainte ?
    Par poukill dans le forum Langage
    Réponses: 29
    Dernier message: 06/02/2008, 20h27
  3. template et polymorphisme
    Par new.proger dans le forum Langage
    Réponses: 14
    Dernier message: 28/08/2007, 00h35
  4. Template et polymorphisme
    Par fabienpot dans le forum Langage
    Réponses: 9
    Dernier message: 07/09/2006, 16h32
  5. Template et polymorphisme
    Par Pierre_IPROS dans le forum Langage
    Réponses: 19
    Dernier message: 09/10/2005, 23h04

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