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 :

syntaxe template spécialisation


Sujet :

C++

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut syntaxe template spécialisation
    Bonjour,

    en me balladant dans du code boost, je suis tombé sur cette syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        template< typename T, std::size_t sz >
        struct range_const_iterator< T[sz] >
        {
            typedef const T* type;
        };
    j'étais habitué à voir soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        template< typename T, std::size_t sz >
        struct range_const_iterator
        {
            typedef const T* type;
        };
    soit ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        template< >
        struct range_const_iterator< T[sz] > //hummm.. finalement me parait pas terrible :)
        {
            typedef const T* type;
        };
    A y réfléchir, on essaye ici de spécialiser les deux paramètres "en même temps"... sans doute dû à ça
    Une explication plus fiable ?
    merci

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    La première est une spécialisation partielle. La deuxième est impossible mais dans l'idée c'est une spécialisation totale.

    Avec un example plus simple :

    template <typename T> //générique
    struct bar
    {};

    template <typename T> //partielle
    struct bar<T*>
    {};

    template <> //totale
    struct bar<int>
    {};

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        template< typename T, std::size_t sz >
        struct range_const_iterator< T[sz] >
        {
            typedef const T* type;
        };
    si c'est partielle, dans quel cas le compilateur n'instanciera pas cette template?
    a partir du moment on où écrit range_const_iterator<Foo,3>, j'ai l'impression que la template sera systématiquement instancié, non ?

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        template< typename T, std::size_t sz >
        struct range_const_iterator< T[sz] >
        {
            typedef const T* type;
        };
    si c'est partielle, dans quel cas le compilateur n'instanciera pas cette template?
    a partir du moment on où écrit range_const_iterator<Foo,3>, j'ai l'impression que la template sera systématiquement instancié, non ?
    non, ce n'est pas parce que y a deux paramnetre qu'il en faut deux. Cette specialisation est appellée pour range_const_iterator<Foo[3]>

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Tu avais déjà vu ce genre de spécialisation partielle, puisque j'avais écrit un code avec ce genre de spécialisation dans un fil de discussion que tu avais ouvert : http://www.developpez.net/forums/d10...lt_of-functor/

    a partir du moment on où écrit range_const_iterator<Foo,3>, j'ai l'impression que la template sera systématiquement instancié, non ?
    Le compilateur n'essaie pas de matcher la lste mais ce qui est dans la déclaration (pour les spécialisation, sinon en effet c'est la liste des paramètres (*) ), donc c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    range_const_iterator<Foo[3]>
    //et pas
    range_const_iterator<Foo,3>
    (*) Qui dans ce cas n'aurait qu'un paramètre et pas deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<class T>
    struct range_const_iterator;
    //Le fait de faire une simple déclaration sans définition permet d'interdire l'instancation d'autre chose qu'une spécialisation (partielle ici)
     
    template<class T, size_t N>
    struct range_const_iterator<T[N]>
    { /*code*/ };
    Le nombre de paramètres de la liste pour la spécialisation n'importe pas, ce qui compte c'est que le nombre de paramètre dans la déclaration (<T[N]>, donc 1), soit le même que le nombre de paramètre de la liste de paramètre de la déclaration du template (à comprendre pas la spécialisation) ( template<class T> struct ..., donc 1 )

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    j'aurais appris quelquechose
    thanks

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/04/2009, 11h30
  2. [Template] Spécialisation partielle d'un template
    Par Kurisu dans le forum Langage
    Réponses: 31
    Dernier message: 25/11/2008, 22h21
  3. [Template] spécialisation partielle des template
    Par vikki dans le forum Langage
    Réponses: 9
    Dernier message: 10/11/2008, 16h29
  4. Template, spécialisations et définitions multiples.
    Par 3DArchi dans le forum Langage
    Réponses: 3
    Dernier message: 26/09/2008, 17h45
  5. Réponses: 19
    Dernier message: 18/03/2007, 16h57

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