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 specialization : const? unsigned? int(*|&)?


Sujet :

Langage C++

  1. #1
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut template specialization : const? unsigned? int(*|&)?
    Bonjour tout le monde.

    Je me pose une question sur la spécialisation de template. Il m'arrive régulièrement de devoir écrire un template utilisé dans le cas général et une spécialisation pour un ou deux type particuliers.
    Seulement voilà, quand je fais ça le template général est utilisé en lieu et place de la spécialisation si le type ne correspond pas a 100%. Du coup je dois écrire pleins de fois la spécialisation.

    Prenons un exemple bidon :
    Code cpp : 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
     
    #include <iostream>
     
    template <typename T> bool is_builtin() { return false; }
    template <> bool is_builtin<int>() { return true; }
     
    class test {};
     
    void main()
    {
    	std::cout << "Type builtin 'test' : " << is_builtin<test>() << std::endl;
    	std::cout << "Type builtin 'int' : " << is_builtin<int>() << std::endl;
    	std::cout << "Type builtin 'unsigned int' : " << is_builtin<unsigned int>() << std::endl;
    	std::cout << "Type builtin 'const int' : " << is_builtin<const int>() << std::endl;
    	std::cout << "Type builtin 'const int&' : " << is_builtin<const int&>() << std::endl;
    }

    Le code ci-dessus me permet donc de savoir si le type fournit est un type builtin ou non (encore une fois c'est un exemple).
    Le problème est que la sortie donne :
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Type builtin 'test' : 0
    Type builtin 'int' : 1
    Type builtin 'unsigned int' : 0
    Type builtin 'const int' : 0
    Type builtin 'const int&' : 0

    Normal puisque int n'est pas pareil que unsigned int, const int ou const int&, le cas général est donc utilisé plutôt que la spécialisation en int.

    Donc pour que ça fonctionne comme souhaité il me faut écrire autant de spécialisation pour int qu'il y a de variante de ce type.
    J'aimerai savoir s'il y a moyen de réduire le nombre de spécialisation à écrire ?

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Bonjour,

    Tu peux essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <typename T> bool is_builtin() { return false; }
    template <typename const T> bool is_builtin() { return is_builtin<T>; }
    template <typename T &> bool is_builtin() { return is_builtin<T>; }
     
     
    template <> bool is_builtin<int>() { return true; }

  3. #3
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Hum... comment j'ai fais pour ne pas penser à ça alors que j'utilise déjà ce genre de constructions dans les templates qui déterminent si le type est un pointeur ou non par exemple...

    Merci en tout cas !

  4. #4
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut
    Tu peux aussi passer par les type traits:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typename std::decay<T>::type

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/08/2012, 09h33
  2. int, unsigned int, et la fonction pow
    Par salseropom dans le forum C
    Réponses: 11
    Dernier message: 22/12/2006, 17h53
  3. const char et const unsigned char
    Par moon93 dans le forum C
    Réponses: 8
    Dernier message: 04/08/2006, 15h59
  4. [WMI] Variant de type Unsigned Int 64 ...
    Par phplive dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 09/05/2006, 20h15
  5. VC7, template et const
    Par charliejo dans le forum MFC
    Réponses: 3
    Dernier message: 31/03/2005, 19h57

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