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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable 2D/3D/Jeux


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    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
    Responsable 2D/3D/Jeux


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    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.

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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
    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 ?

  5. #5
    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
    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.

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    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.

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

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    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)

  8. #8
    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
    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.

  9. #9
    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
    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é ?

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    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.

+ 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