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 alias et spécialisation partielle


Sujet :

Langage C++

Vue hybride

gbdivers template alias et... 29/11/2011, 13h14
gbdivers donc on peut pas spécialiser... 29/11/2011, 13h49
ehmicky Salut, As-tu essayé avec... 29/11/2011, 17h17
Arzar il me semble qu'une... 29/11/2011, 18h02
gbdivers Je l'ai pas dis car c'était a... 29/11/2011, 20h27
gbdivers Par contre, si quelqu'un sait... 29/11/2011, 22h52
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut template alias et spécialisation partielle
    Bonjour à tous

    J'utilise le tag dispatching et la spécialisation partielle pour spécialiser des classes, par exemple en vector :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class any_tag;
     
    template<typename T, typename Tag>
    struct vector {};
     
    template<typename T>
    struct vector<T, any_tag> {};
    J'utilise également dans un cas un std::vector comme spécialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class std_vector_tag;
     
    template<typename T>
    struct vector<T, std_vector_tag> : private std::vector<T>
    {};
    Je suis alors obligé d'exposer les fonctionnalités de std::vector :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vector(size_type n = 0, const T& value= T()) : std::vector<T>(n, value) {}
    reference operator[] (size_type n) { return operator[] (n); }
    const_reference operator[] (size_type n) const { return operator[] (n); }
    // etc.
    (j'utilise l'héritage privé puisque le destructeur de std::vector est public et non virtuel)

    Peut-on quand même se permettre d'utiliser l'héritage public dans ce cas ? (question purement rhétorique, ça resterait dangereux a priori)

    En fait, ce qui m'intéresserait, c'est d'utiliser un template alias pour créer un alias de std::vector dans le cas d'une spécialisation partielle. Par exemple quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<class T>
    using vector<T, std_vector_tag> = std::vector<T>;
    Si quelqu'un a une idée si c'est faisable et comment.
    Merci

    EDIT : en fait, chez moi (gcc 4.7 ubuntu 11.04), les templates alias et la directive -std=c++11 ne fonctionnent pas alors que normalement, ça devrait fonctionner. Un idée ?
    gcc version 4.7.0 20111010 (experimental) [trunk revision 179769] (Ubuntu/Linaro 20111010-0ubuntu1)
    gcc: error: unrecognized command line option '-std=c++11'

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par n2258-1 14.5/3
    Because an alias-declaration cannot declare a template-id, it is not possible to partially or explicitly specialize a template alias.
    donc on peut pas spécialiser un template alias...
    Citation Envoyé par n2258-1 14.2/7
    A template-id that names a template alias specialization is a type-name.
    mais un template alias peut être spécialisé ???

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Par défaut
    Salut,

    As-tu essayé avec gcc -std=c++0x ?

  4. #4
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    il me semble qu'une spécialisation partielle d'alias n'est en effet pas possible.

    En revanche, je pense qu'il est possible d'obtenir ce que tu souhaites en faisant un alias sur un type exposé par une structure intermédiaire, structure qui pourra être elle spécialisée partiellement :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include <vector>
    #include <iostream>
     
    struct std_tag{};
    struct user_tag{};
     
    template <typename T, typename Tag>
    struct vector_imp
    {
       // ton vecteur perso
       void push_back_perso(int i)
       {
          std::cout << "i" << std::endl;
       }
    };
     
    template<typename T, typename Tag>
    struct dispatch_vector_type
    {
       typedef vector_imp<T, Tag> type;
    };
     
     
    template<typename T>
    struct dispatch_vector_type<T, std_tag>
    {
       typedef std::vector<T> type;
    }
     
    template<typename T, typename Tag = user_tag>
    using vector = typename dispatch_vector_type<T, Tag>::type;
     
     
    int main()
    {
      vector<int> v1;
      v1.push_back_perso(4);
      vector<int, std_tag> v2;
      v2.push_back(4);
    }
    Le code ci-dessus compile et donne le résultat attendu. Maintenant je crois que je resterais un peu nerveux d'avoir une classe portant le même nom qu'une classe de la STL (et c'est un peu fragile, par exemple il suffit d'ajouter un using namespace std et le code ne compile plus)

    Edit:
    Je viens de réaliser que le site de Stroustup conseille la même technique :
    http://www2.research.att.com/~bs/C++...template-alias

    Et pour ce qui es de la spécialisation d'alias, son explication est claire et concise :
    Citation Envoyé par BS
    Specialization works (you can alias a set of specializations but you cannot specialize an alias)

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par ehmicky Voir le message
    As-tu essayé avec gcc -std=c++0x ?
    Je l'ai pas dis car c'était a priori évident que j'avais testé cette option

    @Arzar
    L'évidence même. On ajoute une indirection qui sera chargé de choisir la bonne structure. Finalement, on a quelque chose de similaire (dans la fonction) à un object generator.
    Merci
    (ps: j'avais regardé la FAQ de Stroustrup mais trop rapidement manifestement)

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Par contre, si quelqu'un sait pour le problème d'activation de C++11 avec gcc 4.7 ?

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par gbdivers Voir le message
    Par contre, si quelqu'un sait pour le problème d'activation de C++11 avec gcc 4.7 ?
    On fait comme pour les version précédente: en passant l'option -std=c++0x

    Ils ont parlé de remplacer celle-ci par -std=c++11 mais ils semblerait que cela n'ai pas encore été fait
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. [Problème] Alias de spécialisation de template
    Par DocteurV dans le forum Langage
    Réponses: 9
    Dernier message: 31/08/2009, 17h09
  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. Réponses: 4
    Dernier message: 15/10/2008, 09h33
  5. Réponses: 4
    Dernier message: 04/09/2008, 10h58

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