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 templatiser une methode virtuelle?


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 134
    Points : 77
    Points
    77
    Par défaut comment templatiser une methode virtuelle?
    Bonjour;
    Mon compilateur me balance une erreur lorsque je templatise une methode virtuelle. J'ai lu quelque part que c'etait impossible? Est-ce vrai? Si oui, pourquoi?
    Est-ce qu'il existe un moyen détourné d'avoir une methode virtuelle templatisé?
    Merci d'avance.

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Hypnocrate Voir le message
    Mon compilateur me balance une erreur lorsque je templatise une methode virtuelle. J'ai lu quelque part que c'etait impossible? Est-ce vrai?
    Oui.

    Si oui, pourquoi?
    Ca interragit plutot mal ensemble en C++ (il y a d'autres languages ayant une définition différente où ça passe mieux, principalement parce que le modèle des templates est différents -- pas de spécialisation explicite en particulier).

    Est-ce qu'il existe un moyen détourné d'avoir une methode virtuelle templatisé?
    C'est assez difficile de savoir quelle sémantique tu veux donner à ça -- comme déjà écrit le mélange passe assez mal en C++. Tu peux obtenir certains effets (en gros ce qui est disponible dans les langages qui on un modèle template différent et permettent l'équivalent de virtuelles templates) en utilisant des techniques comme avoir une classe de base et une classe template qui en dérive, ta fonction virtuelle prenant une référence vers la classe de base, un membre template non virtuel batissant un objet de la classe template que tu veux.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 134
    Points : 77
    Points
    77
    Par défaut
    Merci pour ta réponse Jean-Marc.
    J'ai un peu de mal à suivre ta technique, est-ce que tu pourrais donner un petit exemple?
    Merci d'avance.

  4. #4
    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
    Cela n'est pas possible car cela nécessiterait de générer du code à l'édition de liens. Déjà que les compilateurs ont du mal avec export template...
    Enfin techniquement rien ne l'empêche dans l'absolu, et ça permettrait des choses extrêmement puissantes.
    Boost ftw

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    ... des techniques comme avoir une classe de base et une classe template qui en dérive, ta fonction virtuelle prenant une référence vers la classe de base, un membre template non virtuel batissant un objet de la classe template que tu veux.
    ça marche bien en effet !

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Voici un exemple.

    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>
    #include <ostream>
     
    class Parent {
    public:
        virtual std::ostream& print(std::ostream& os) const = 0;
    };
     
    std::ostream& operator<<(std::ostream& os, Parent const& p)
    {
        return p.print(os);
    }
     
    template <typename T>
    class Child: public Parent
    {
    public:
        Child(T const& v) : myValue(v) {}
        std::ostream& print(std::ostream& os) const {
            return os << myValue;
        }
    private:
        T myValue;
    };
     
    class Base
    {
    public:
        template <typename T>
          void display(std::ostream& os, T const& v) {
            Child<T> c(v);
            doDisplay(os, c);
        }
    protected:
        virtual void doDisplay(std::ostream& os, Parent const& p)
        {
            os << "Base::display(" << p << ")\n";
        }
    };
     
    class Derived: public Base
    {
    protected:
        virtual void doDisplay(std::ostream& os, Parent const& p)
        {
            os << "Derived::display(" << p << ")\n";
        }
    };
     
    int main()
    {
        Base b;
        b.display(std::cout, 3);
        b.display(std::cout, 4.2);
        Derived d;
        d.display(std::cout, 42L);
        d.display(std::cout, 'x');
        d.display(std::cout, 3.141592);
    }
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 134
    Points : 77
    Points
    77
    Par défaut
    Merci.

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/08/2006, 11h58
  2. Réponses: 5
    Dernier message: 01/08/2006, 13h41
  3. Réponses: 2
    Dernier message: 19/05/2006, 15h53
  4. Réponses: 2
    Dernier message: 02/05/2006, 14h34
  5. [C#][Débutant] Comment lancer une methode d'une autre fenetre
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 5
    Dernier message: 30/04/2006, 23h17

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