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 :

Spécialisation des templates, syntaxe / possibilités


Sujet :

C++

  1. #1
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut Spécialisation des templates, syntaxe / possibilités
    Bonjour,

    J'essaie d'utiliser les templates en C++. Aujourd'hui, je pensais faire un Vector (dans le sens, vertex, mais dans un système de coordonnées N). Je pensais faire des spécialisations de template, pour N = 3 et N = 4.
    Mais finalement, cela m'a forcé à copier / coller les fonctions de vector<T,N> pour les avoir dans le vector<T,3>. Ok, j'ai compris ma première erreur en lisant la FAQ -> http://cpp.developpez.com/faq/cpp/?p...specialisation
    La spécialisation de classe est elle plus contraignante car il faut redéfinir la totalité de celle-ci.
    Du coup, je fais du copier-coller. Ce n'est pas génial.
    J'imagine que j'ai donc pris une mauvaise direction. Notamment car il se peut que je n'aurais jamais besoin de mon vector<T,N>

    Bref, toujours est il, que j'aimerais connaitre la syntaxe qu'il faut utiliser dans le cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Vector de base
    template <typename T, unsigned int N>
    struct Vector
    {
    // Mon code
    }
     
    // Ma spécialisation:
    template <typename T>
    struct Vector3<T,3> // Erreur de compilation ici
    {
     
    }
    Est ce possible de l'écrire, ou alors, je fait vraiment n'importe quoi?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  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 : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Tu spécialises, donc tu dois garder le même nom de classe !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Vector de base
    template <typename T, unsigned int N>
    struct Vector
    {
    };
     
    template <typename T>
    struct Vector<T,3> 
    {
     
    };
    Et une fois C++11 bien supporté, tu pourra même faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template <typename T> using Vector3 =Vector<T,3> ;
    "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)

  3. #3
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Comme le nom a changé, ce n'est pas une spécialization partielle. Il n'y a aucun lien entre tes deux classes...

    A priori tu veux


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Ma spécialisation:
    template <>
    struct Vector<T,3> 
    {
         // code pour la spécialization
    }; 
     
    template< typename T > using Vector3 =  Vector<T,3>; // alias pour avoir un nom différent.
    Enlève la spécialization si tu voulaisj uste un nom différent.

    edit> oups j'avais oublié que l'alias est une feature C++11.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Effectivement, j'avais oublié cette caractéristique.

    Merci beaucoup.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    Il y a t'il une différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename T>  using Vector3 =Vector<T,3> ;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename T> 
    class Vector3 :Vector<T,3>{};
    ?
    D'ailleurs cette dernière syntaxe est-elle valide ?

  6. #6
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Il me semble que la façon correcte de le faire en C++03 c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template< typename T >
    struct Math
    {
        typedef Vector<T,3> Vector3;
    };
     
    //...
     
    Math<float>::Vector3 mon_vector3f;
    Ce qui évite d'impliquer de l'héritage là où il peut être dangereux et franchement pas nécessaire.

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par atha2 Voir le message
    Il y a t'il une différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename T>  using Vector3 =Vector<T,3> ;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename T> 
    class Vector3 :Vector<T,3>{};
    ?
    D'ailleurs cette dernière syntaxe est-elle valide ?
    Effectivement, la deuxième méthode est bonne et c'est celle que je vais utilisé .
    Merci
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,

    Citation Envoyé par LittleWhite Voir le message
    Du coup, je fais du copier-coller. Ce n'est pas génial.
    Non, effectivement. Pourquoi as-tu besoin de spécialiser par arité ?

  9. #9
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Non, effectivement. Pourquoi as-tu besoin de spécialiser par arité ?
    Que voulez vous dire par "par arité" (ou autre mot ).

    Je vais tout de même tenter d'expliquer mon raisonnement, que je conçoit comme étant un peu idiot.

    Je veux faire une classe Vector (pour la position de point / vecteur 3D). Alors, j'aurais pu réutiliser mon code pour le Vector3 et mon code pour le Vector4. Mais je me suis dit, que pour être plus réutilisable et pour utiliser un peu plus les templates. Je n'aurais certainement pas besoin de cette classe très généraliste des Vector (N).

    Pourquoi une spécialisation des Vector<N>, tout simplement car je voulais avec les fonctions x() ; y() ; z() sur cette spécialisation. Aussi car je ne sais faire le cross product, que sur 3 dimensions .
    Je voulais aussi rajouter une surcharge de l'opérateur << pour un débugguage plus facile du Vector3 (alors que pour un Vector<N> c'est moins facile).

    Voilà un peu mon principe, mais je me rends compte que c'est assez idiot, et que j'ai peut être perdu du temps sur un truc qui ne me servira à rien :s.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  10. #10
    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 : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    La 1er ligne c'est les template typedef C++11. C'est exactement ce que tu cherches, un alias sur un type template. Y'a plus qu'a attendre que les compilos soient compatibles
    "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)

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Oui, mais est ce qu'avec la norme C++11, je vais pouvoir rajouter des fonctions, qui ne sont pas dans le template généraliste ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #12
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Oui, mais est ce qu'avec la norme C++11, je vais pouvoir rajouter des fonctions, qui ne sont pas dans le template généraliste ?
    non

    Bon, pour tes templates : tu auras du mal à avoir quelque chose de performant si tu cherches a faire du générique T,N, même si tu spécialise après pour T,3 (d'ailleurs, une couleur R,G,B est aussi un vecteur dans ce cadre ; donc il te faudrait une classe ou les accesseurs sont r(),g(), et b() )

    En termes de design, il est préférable de faire une classe vector3<T> et une class vector4<T> ; voire vector3f/vector3d et vector4f/vector4d. Et ce n'est pas sûr que la version "double" soit vraiment utile, du coup tu devrais pouvoir la virer et avoir vector3 et vector4, qui ne sont pas des classes templates
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  13. #13
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    C'est bien ce que je pensais. Je m'enfonce dans des trucs après avoir lu trop de posts sur le design d'application.

    Y a t'il une perte de performance avec, le code Vector<T,N> et un héritage pour faire une spécialisation Vector3 ?

    Car au final, je suis dans une application de rayTracing, qui doit être un minimum performante.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  14. #14
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    C'est bien ce que je pensais. Je m'enfonce dans des trucs après avoir lu trop de posts sur le design d'application.

    Y a t'il une perte de performance avec, le code Vector<T,N> et un héritage pour faire une spécialisation Vector3 ?

    Car au final, je suis dans une application de rayTracing, qui doit être un minimum performante.
    Si tu hérites du cas général <T,N>, alors tu vas aussi hériter de la structure sous-jacente, qui n'est pas nécessairement adaptée.

    Pendant que j'y suis, les vecteur à 3 dimensions ne sont qu'un sous cas des vecteurs à 4 dimensions, et ces derniers sont bien plus puissants. D'autant plus qu'ils sont utilisables avec les instructions de vectorisation des processeurs, ce qui peut pousser à travailler sur des données brutes (des structures POD) alignées selon ce qu'attend le processeur.

    Il y a eu une discussion sur ce sujet (librairie de math adaptée au jeu vidéo) sur la mailing list [GDAlgorithms] il y a quelques années (Jon Watte était, si je me rappelle bien, très actif sur le sujet).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/09/2012, 01h56
  2. Syntaxe des template avec G++
    Par LittleWhite dans le forum Langage
    Réponses: 5
    Dernier message: 01/08/2011, 11h11
  3. Réponses: 19
    Dernier message: 23/12/2009, 19h22
  4. [Template] spécialisation partielle des template
    Par vikki dans le forum Langage
    Réponses: 9
    Dernier message: 10/11/2008, 16h29
  5. Macros : Possibilité simuler des templates ?
    Par TheDrev dans le forum Débuter
    Réponses: 6
    Dernier message: 22/04/2008, 16h06

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