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 :

Limiter type template


Sujet :

C++

  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut Limiter type template
    Bonjour,

    je souhaite limiter le type de mes template à des int ou des unsigned int. En gros je souhaiterai que tout ce qui est float/double ne soit pas implémenté.
    J'ai trouve cette TRES vieille discussion et bien d'autre du même type sur le net, mais toute très vieilles.
    Mais C++ évolue constamment.
    Est ce que ce que je souhaite faire n'est toujours pas possible ?

    Merci par avance.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Bonjour

    C'est possible et très simple à partir de C++11 en utilisant static_assert.

    Tu peux limiter à int et unsigned int avec std::is_same<T1, T2>::value mais il est probable que si ton code fonctionne pour int et unsigned int, il fonctionnera pour tout ce qui se comporte comme un entier signé ou pas. Dans ce cas, tu peux utiliser std::numeric_limits<T>::is_integer

    Voici un petit exemple qui illustre tout ça :
    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
    // g++ -Wall -Wextra -Wconversion -Wsign-conversion -std=c++11 -pedantic -fopenmp main.cpp -o main && ./main
     
    #include <iostream>
    #include <type_traits>
    #include <limits>
     
    template <class T>
    class int_or_uint
    {
    	static_assert(std::is_same<T, int>::value || std::is_same<T, unsigned int>::value, "int_or_uint<T>: error: T is not int or unsigned int");
    };
     
    template <class T>
    class any_integer
    {
    	static_assert(std::numeric_limits<T>::is_integer, "any_integer<T>: error: T is not an integer");
    };
     
    int main ()
    {
    	int_or_uint<int> a;
    	int_or_uint<unsigned int> b;
    	//int_or_uint<float> c; // error: static assertion failed: int_or_uint<T>: error: T is not int or unsigned int
     
    	any_integer<long int> d;
    	any_integer<char> e;
    	//any_integer<double> f; // error: static assertion failed: any_integer<T>: error: T is not an integer
     
    	return 0;
    }
    Note : Dans le futur de C++ (C++17 par exemple), on aura la notion de concept qui permettra de limiter non pas à une caractéristique particulière (l'opérateur + existe, le constructeur par défaut existe ? ...) mais à un ensemble des caractéristiques qui ont un sens (est-ce un container ? ...).

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Super !!!
    Merci infiniment.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    En faisant des recherches sur static_assert, j'ai lu que souvent le flag utilisé est -std=c++0x
    Quel est l'avantage de l'un par rapport à l'autre?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    c'est l'ancien nom et flag du C++11
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Avant la sortie définitive de la norme en C++11, on parlait de C++0x, le x devait être remplacé par l'année de sortie de la norme. Comme celle ci n'est pas sortie avant 2010 (et que la notation n'est pas en l’hexadécimal), c'est devenu C++11 (en hexadécimal, on aurait eu C++0B)).
    Donc, sur les "vieux" compilateurs (avant 2011), on passait l'option -std=c++0x pour profiter de la future norme (de 2011). Maintenant on utilise -std=c++11 ou -std=c++14 (-std=c++1y sur certains compilateurs avant 2014) ou même -std=c++1z pour profiter des fonctionnalités prévues pour 2017.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Il faut aussi noter que l'on trouve quelques traits géniaux, depuis C++11, dans le fichier d'en-tête <type_traits>... Quelques élément choisis (à vous de deviner le sens ) "pas vraiment par hasard"
    • std::is_floating_point
    • std::is_integer
    • std::is_signed
    • std::is_unsigned
    • std::is_float
    • std::is_double
    • std::enable_if // plus difficile à manipuler, celui là ;)

    Avec ces quelques traits (et surtout le dernier) il est tout à fait possible de faire en sorte qu'une fonction ne soit disponible que pour un type parfaitement défini, par exemple... Mais il y en a d'autres
    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. Réponses: 1
    Dernier message: 29/07/2012, 20h30
  2. [template]Résolution implicite d'un type template
    Par ZeeByeZon dans le forum Langage
    Réponses: 4
    Dernier message: 23/07/2010, 15h04
  3. [Template] Déclaration des types template
    Par khaledbenamor dans le forum Langage
    Réponses: 2
    Dernier message: 18/11/2008, 09h56
  4. T<G> avec T et G de type template
    Par vincho dans le forum Langage
    Réponses: 4
    Dernier message: 02/03/2007, 09h59
  5. Réponses: 13
    Dernier message: 25/10/2006, 16h17

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