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++

  1. #1
    Membre éclairé 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
    Points : 693
    Points
    693
    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 éclairé 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
    Points : 693
    Points
    693
    Par défaut
    Ça ne choque personne ce que j'ai écrit?
    Ça doit être correct alors .

  3. #3
    Membre averti
    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
    Points : 307
    Points
    307
    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 éclairé 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
    Points : 693
    Points
    693
    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 averti
    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
    Points : 307
    Points
    307
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    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.

  7. #7
    Membre éclairé 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
    Points : 693
    Points
    693
    Par défaut
    Merci pour ta suggestion.

    Je laisse le choix premièrement parceque en fait j'écris ça sous forme d'une bibliotheque. Donc je pense qu'il est intéressant de laisser choisir l'utilisateur.
    Ensuite je me sers de Couleur pour la classe Material. Et pour ses composantes il faut des float.
    Hors je penses que l'utilisateur voudrait utiliser autre chose que des float.
    Mais je me demande si des float ne suffisent pas. Et il intéressant d'utiliser des doubles? (la c'est plus vraiment une question de c++ )

  8. #8
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je laisse le choix premièrement parceque en fait j'écris ça sous forme d'une bibliotheque. Donc je pense qu'il est intéressant de laisser choisir l'utilisateur.
    Justement, ce que je te disais c'est qu'on laisse généralement ce choix, mais sous forme de conversions vers / depuis une représentation interne fixée.
    De plus l'inconvénient c'est que chaque fonction de ta bibliothèque qui prendra en paramètre une couleur, devra être template.

    Et il intéressant d'utiliser des doubles?
    En programmation 3D, rarement (personnellement : jamais).

  9. #9
    Membre éclairé 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
    Points : 693
    Points
    693
    Par défaut
    on laisse généralement ce choix, mais sous forme de conversions vers / depuis une représentation interne fixée
    Il ne risque pas d'y avoir beaucoup de conversions, qui pourraient faire baisser un peu les performances?

    chaque fonction de ta bibliothèque qui prendra en paramètre une couleur, devra être template.
    Oui c'est vrai, même si une partie des classes qui se servent des couleurs n'utilise qu'une spécilisation (comme Material), est ce un problème?

    En programmation 3D, rarement (personnellement : jamais).
    Dans ce cas, je peux éviter le template...

  10. #10
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il ne risque pas d'y avoir beaucoup de conversions, qui pourraient faire baisser un peu les performances?
    Ca dépend de l'application. Mais en 3D il y a tellement d'autres choses à optimiser avant ça.

    Oui c'est vrai, même si une partie des classes qui se servent des couleurs n'utilise qu'une spécilisation (comme Material), est ce un problème?
    Non pas du tout, je voulais juste soulever un point que je pense important, après si ça ne pose aucun problème tant mieux

    Dans ce cas, je peux éviter le template...
    Et les autres types ?

  11. #11
    Membre éclairé 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
    Points : 693
    Points
    693
    Par défaut
    Et les autres types?
    Tu veux parler des entiers? On s'en sert beaucoup de ça pour les couleurs?

  12. #12
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Disons qu'il y a deux types qui sont pratiques pour les composantes de couleurs : float et unsigned char. Après tu peux aussi manipuler des entiers 32 bits, mais là tu dépends de l'endianess.

    Faut voir quel est le but de ta bibliothèque en fait.

  13. #13
    Membre éclairé 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
    Points : 693
    Points
    693
    Par défaut
    Pour l'instant elle me sert à factoriser les fonctionnalités d'OpenGL, pour mes tp de Synthèse d'images.
    Quand est il plus intéressant de se servir des unsigned char que des float?

  14. #14
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour l'instant elle me sert à factoriser les fonctionnalités d'OpenGL, pour mes tp de Synthèse d'images.
    Ok, donc je pense que tu peux rester sur du float uniquement.

    Quand est il plus intéressant de se servir des unsigned char que des float?
    Quand on manipule des pixels, généralement.

  15. #15
    Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 49
    Points : 43
    Points
    43
    Par défaut
    Juste un mot:
    Si tu specialise un membre d'un template, tu n'as plus le droit de specialiser la classe entiere

  16. #16
    Membre éclairé 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
    Points : 693
    Points
    693
    Par défaut
    adel_dz> C'est ce que disais hylvenir .

    Quand on manipule des pixels, généralement.
    Quand on manipule des pixels à quel niveau (position, ...) ?

  17. #17
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par MatRem
    Quand on manipule des pixels à quel niveau (position, ...) ?
    Au niveau de leur couleur évidemment.

  18. #18
    Membre éclairé 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
    Points : 693
    Points
    693
    Par défaut
    Pour ce qui est d'OpenGL, ça correspond à la manipulation des fragments?

  19. #19
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je parlais plus généralement. Par exemple lorsque tu charges une image à partir d'un fichier, tu auras très certainement les pixels sous forme de composantes entières non signées. Pareil lorsque tu vas manipuler une texture, à part les "nouveaux" formats en virgule flottante, ce sera des formats à base de composantes entières non signées.

  20. #20
    Membre éclairé 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
    Points : 693
    Points
    693
    Par défaut
    Ok d'accord, j'y étais pas .
    Oui effectivement là c'est clair que les valeurs entières sont très utilisée.

    Bon ben merci pour tes explications, et merci à tous les posteurs .

+ 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