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 :

Spécialisation de template pour le type tableau


Sujet :

Langage C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut Spécialisation de template pour le type tableau
    Dans un souci de compréhension (à comprendre par là que je ne suis pas atteint de NIH), je suis en train d'implémenter une version de la classe is_array de Boost.

    J'ai le code suivant :
    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
    #include <iostream>
     
    using namespace std;
     
    template<typename T>
    struct is_array
    {
        static const bool value = false;
    };
     
    template< typename T >
    struct is_array< T[] >
    {
        static const bool value = true;
    };
     
    int main()
    {
        is_array< int[2] > :: value ? cout << "array" << endl : cout << "other type" << endl;
     
        return 0;
    }
    Cependant lorsque j'instancie la classe is_array pour un type tableau, ce n'est pas la classe spécialisée qui est instanciée mais la générique.
    Cependant en spécialisant la classe is_array pour les tableaux de 2 éléments, j'ai bien le comportement voulu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template< typename T >
    struct is_array< T[2] >
    {
        static const bool value = true;
    };
    Ma question est :
    -est ce possible de "spécialiser génériquement" la classe is_array pour les différentes tailles de tableau c'est à dire est ce qu'il est possible de n'avoir qu'une spécialisation qui gérerait toutes les tailles ?

    PS : j'ai été voir le code de Boost, j'ai l'impression que c'est le préprocesseur qui crée les bonnes spécialisations selon la taille du tableau et son type d'élément, mais j'aimerais tout de même savoir cela est réalisable sans utiliser le préprocesseur.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 13
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par backlash Voir le message
    Ma question est :
    -est ce possible de "spécialiser génériquement" la classe is_array pour les différentes tailles de tableau c'est à dire est ce qu'il est possible de n'avoir qu'une spécialisation qui gérerait toutes les tailles ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    template <class T>
    struct is_array{
      static const bool value = false;
    };
     
    template <class T, int N>
    struct is_array < T[N] >
    {
      static const bool value = true;
    };
    Tu avais la réponse dans ta question
    Une specialisation partielle

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut
    Par contre, est ce que ta solution est bien de la spécialisation partielle?.
    En effet, tu rajoutes un paramètre template à la classe générique, est ce bien un cas de spécialisation partielle?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 13
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par backlash Voir le message
    Par contre, est ce que ta solution est bien de la spécialisation partielle?.
    En effet, tu rajoutes un paramètre template à la classe générique, est ce bien un cas de spécialisation partielle?
    Oui ta template reste is_array<T> avec un paramètre template, et tu la spécialise pour une catégorie de
    type,

    Tu peux verifier avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    	typedef int tab[20];
    	is_array< tab > :: value ? std::cout << "array" << std::endl : std::cout << "other type" << std::endl;

  5. #5
    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 backlash Voir le message
    Par contre, est ce que ta solution est bien de la spécialisation partielle?.
    En effet, tu rajoutes un paramètre template à la classe générique, est ce bien un cas de spécialisation partielle?
    template<class T> struct dummy{} : définition générique.

    template<> struct dummy<int[42]>{} : spécialisation (non partielle) (1).

    template<class T, int N> struct dummy<T[N]>{} : spécialisation partielle (2).

    La spécialisation (2) est partielle tout simplement parce qu'il reste des paramètres génériques dans cette spécialisation alors que dans la spécialisation (1) il ne reste plus de paramètre générique. Le fait d'ajouter ou de fixer des paramètres est annexe, la spécialisation reste partielle dès lors qu'il reste des éléments génériques dans la spécialisation. On pourrait imaginer d'autres spécialisations partielles :


    template<int N> struct dummy<int[N]>{} ;
    template<class T, int N> struct dummy<T[N]>{} ;
    template<class T> struct dummy<std::vector<T> >{} ;
    template<class T, class... TypeValues> struct dummy<T[ boost::mpl::plus<TypeValues...>::type::value ] > {} ;

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

Discussions similaires

  1. Réponses: 20
    Dernier message: 12/11/2014, 13h33
  2. Tableau pour tout type ?
    Par Madon dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 24/05/2011, 08h49
  3. Réponses: 7
    Dernier message: 17/07/2008, 11h10
  4. Format pour afficher un tableau de type complexe
    Par feynman dans le forum Fortran
    Réponses: 6
    Dernier message: 02/03/2008, 19h53

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