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 :

Template, spécialisation de la définition de fonctions membres


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut Template, spécialisation de la définition de fonctions membres
    A priori ce que je vais demander fonctionne avec g++, mais je me demande si c'est bien légal, puisque je ne l'ai vu expliqué nul part.

    Soit un model de classe C<T> possédant des fonctions membres, est il possible de spécialiser, certaines de ses fonctions membres, seulement dans leur définition?

    Un petit exemple descriptif:
    Code C.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <typename T>
    class C
    {
       void test();
    }
     
    #include "C.tpp"

    Code C.tpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    template<typename T>
    void C<T>::test()
    {
       ...
    }
    template<>
    void C<double>::test()
    {
       ...
    }
    template<>
    void C<float>::test()
    {
       ...
    }

    Ainsi avec une utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C<double> t;
    //t::test(); edité
    t.test();
    ce sera la spécialisation C<double>::test qui sera utilisée.

    Ce que j'ai compris dans ce genre de cas, c'est qu'il faut déclarer entièrement les models C<double> et C<float>. Est-ce vraiment ce que dit la norme?

  2. #2
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    Ça ne choque personne ce que j'ai écrit?
    Ça doit être correct alors .

  3. #3
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    C<double> t;
    t::test(); // déclenche une erreur sous gcc 4.1
    // t n'est pas une classe ni une ni un namespace
    // il faudrait t.test();
    Tu peux spécialiser un seul membre mais tu ne peux plus ensuite spécialiser la classe complète.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template<>
    classe C<double> {
    };
    devrait produire une erreur.

    Je ne suis pas trop sûr de comprendre l'intéret de spécialiser une seule méthode.

  4. #4
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    Oui excuse moi je voulais mettre un ., j'ai été un peu trop vite. (j'édite mon premier post).

    L'intérêt par exemple (il est lié à OpenGL):
    - J'ai une classe Couleur<T> qui contient les composantes r, v, b, a. Elle contient aussi une fonction glCall(), qui permet de faire l'appel OpenGL correspondant ;
    - la classe sera utilisée avec int, double ou float ;
    - j'aurais voulu réduire les possibilités du type template, mais ce n'est pas encore possible ;
    - donc la fonction glCall n'est pas définit par défaut ;
    - par contre, elle est spécialisée pour les 3 types précédents, pour utiliser glColor4d*, glColor4f*, ou glColor4i* .

    Je n'ai donc pas besoin de spécialiser toute la classe.

    Voilà mon exemple, peut être y'a t il moyen de faire mieux...

  5. #5
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Citation Envoyé par MatRem
    - j'aurais voulu réduire les possibilités du type template, mais ce n'est pas encore possible ;
    pour limiter les spécialisations possibles de Couleur<T> ?

    Si oui, tu dois pouvoir le faire en t'aidant des erreurs de link.

    Pour une meilleure solution, je ne sais pas. J'aurais tout simplement spécialisé la classse.

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Une autre solution :

    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
    template <typename T>
    class Couleur
    {
    public :
     
        void glCall() {Private_glCall(r, v, b, a);}
     
    private :
     
        T r, v, b, a;
    };
     
    void Private_glCall(int r, int v, int b, int a)             {glColor4i(r, v, b, a);}
    void Private_glCall(float r, float v, float b, float a)     {glColor4f(r, v, b, a);}
    void Private_glCall(double r, double v, double b, double a) {glColor4d(r, v, b, a);}
    Au passage, ça génèrera une erreur si T n'est pas un type convertible en int, float ou double (ce qui n'est déjà pas mal). Tant que tu y es tu devrais aussi gérer les autres types (unsigned char par exemple est le plus utilisé).

    Simple curiosité : tu laisses le choix du type de composantes pour quelles raisons ? D'habitude en programmation 3D, sauf besoin spécifique, on choisit une représentation interne unique pour les couleurs, et on gère les conversions vers / depuis d'autres types.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 05/01/2010, 08h32
  2. Réponses: 3
    Dernier message: 09/04/2009, 11h30
  3. Problème de spécialisation de fonction membres template
    Par ludovic.barrillie dans le forum Langage
    Réponses: 3
    Dernier message: 17/04/2007, 08h44
  4. Réponses: 5
    Dernier message: 29/12/2005, 21h27
  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