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 :

Templatiser la constance


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Templatiser la constance
    Hello,

    Soit la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    struct MaClasse
    {
        const long monMembre;      // on ne rit pas
    }
    Serait-il possible de faire varier la nature constante du membre selon le type T ?

  2. #2
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonjour,
    Je ne suis pas sur de comprendre, mais peut-être avec une liste "Type to type", du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<typename I>
    struct MyTypeOf
    {
      typedef long Type; //Par défaut tout les type sont associé a long
    };
     
    template<>
    struct MyTypeOf<UnTypeParticulier>
    {
      typedef long const Type; //Ce type est associé a long const
    };
    Remarque : "typename I" peut aussi être remplacer par un bool, comme ça la constance peut être conditionnelle, plutôt que dépendante d'un type.

    C'est pas très clair je pense, alors voila une meilleur explication:
    http://cpp.developpez.com/faq/cpp/?p...S_classe_trait
    http://alp.developpez.com/tutoriels/traitspolicies/

  3. #3
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Et en compilant les 2 idées, on peut avoir quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template<typename T>
    struct Type {};
    template<>
    struct Type<int> { int member; };
    template<>
    struct Type<long> { const int member; }
    //.. plus de spécialisation
     
    template< typename T >
    struct MyClass
    {
     Type<T> myType;
    };
    qui devrait fonctionner.

    Edit:
    ou alors tu parles de virer ou non le const selon le type ?
    Dans ce cas, il s'agit juste de la spécialisation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T>
    struct MyClass { const long member; };
    template<>
    struct MyClass<int> { long member; };
    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.

  4. #4
    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 oodini Voir le message
    Hello,

    Soit la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    struct MaClasse
    {
        const long monMembre;      // on ne rit pas
    }
    Serait-il possible de faire varier la nature constante du membre selon le type T ?
    Tu veux dire faire quelque chose comme ç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
    template <class T>
    struct MaClasse
    {
        const long monMembre = 0;      // on ne rit pas
    };
    
    template <>
    struct MaClasse<int>
    {
        long monMembre = 0;      // on ne rit pas
    };
    
    MaClasse<double> d;
    d.monMembre = 10; // erreur : membre const
    
    MaClasse<int> i;
    i.monMembre = 10; // ok
    EDIT : oh, les gros fail que je fais...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    J'avais pensé à ça, mais c'était la solution que je voulais éviter.

    Je pensais plus à quelque chose au niveau de la définition du membre.
    Je pense que c'est possible, mais plus j'y réfléchis, plus je me dis que ça sera gourmand à la compilation (il y a en fait 10 à 15 membres, et une trentaine de classes).

    Citation Envoyé par gbdivers Voir le message
    Tu veux dire faire quelque chose comme ça ?
    Je pensais plus à un truc comme ça.
    Mais sans Boost.

  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
    Citation Envoyé par oodini Voir le message
    J'avais pensé à ça, mais c'était la solution que je voulais éviter.

    Je pensais plus à quelque chose au niveau de la définition du membre.
    Je pense que c'est possible, mais plus j'y réfléchis, plus je me dis que ça sera gourmand à la compilation (il y a en fait 10 à 15 membres, et une trentaine de classes).
    euh...
    Just do it
    KISS
    d'autres acronymes pour dire de faire ça dans un premier temps et d'optimiser la compilation ensuite si tu as un problème
    Bref, pas d'optimisation prématurée

  7. #7
    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 oodini Voir le message
    Je pensais plus à un truc comme ça.
    Mais sans Boost.
    Ca revient au même
    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
    class no_const_tag {};
    class const_tag {};
     
    template <class T = no_const_tag>
    struct MaClasse
    {
        long monMembre = 0;      // on ne rit pas
    };
     
    template <>
    struct MaClasse<const_tag>
    {
        const long monMembre = 0;      // on ne rit pas
    };
     
    MaClassed;
    d.monMembre = 10; // erreur : membre const
     
    MaClasse<const_tag > i;
    i.monMembre = 10; // ok
    EDIT : tu as aussi les std::remove_const ou équivalent de type_traits, il y a peut être un qui correspond à ce que tu recherches ?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Bon, en fait, les classes correspondent à des tables SQL, et les membres à des colonnes.
    Il y a ensuite une moulinette qui convertit tout ça en code C++ (définitions de classes).

    Il faut d'abord que je voie si je peux récupérer définir ces informations de constances sous formes de métadonnées des colonnes SQL.

    J'ai mis la charrue avant les bœufs. Désolé.

    Je vais mettre le fil en Résolu pour l'instant.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    J'ai trouvé dans C++11 add_const (issu de <type_traits>), mais j'ai du mal à trouver le moindre exemple de code...

  10. #10
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par oodini Voir le message
    mais j'ai du mal à trouver le moindre exemple de code...
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <type_traits>
     
    template <class T>
    struct MaClasse
    {
       typename std::conditional<std::is_signed<T>::value, std::add_const<long>::type, long>::type monMembre;
    };
     
    int main()
    {
       //MaClasse<signed int> m1; //ne compile pas car type signé donc monMembre est const
       MaClasse<unsigned int> m2;
    }

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Mis à part qu'il faudrait que j'utilise un enum comme condition, c'est exactement ce qu'il me faut.

    Merci.

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

Discussions similaires

  1. constance du contenu et du contenant
    Par CedricMocquillon dans le forum C++
    Réponses: 3
    Dernier message: 03/09/2008, 09h35
  2. conteneur de T * => casse la constance
    Par MatRem dans le forum C++
    Réponses: 9
    Dernier message: 16/06/2008, 21h08
  3. Annotation templatisée possibles ?
    Par onlytoine dans le forum Langage
    Réponses: 3
    Dernier message: 29/04/2008, 10h42
  4. [map] constance des itérateurs à l'insertion
    Par koala01 dans le forum SL & STL
    Réponses: 15
    Dernier message: 14/11/2007, 21h25
  5. Réponses: 1
    Dernier message: 25/07/2006, 15h52

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