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 :

Créer une map avec un type comme clé


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut Créer une map avec un type comme clé
    Bonjour,


    J'aimerai savoir s'il était possible de faire un dictionnaire prenant en clé un type.
    En effet, j'ai un module qui doit référencer certaines classes et leur attribuer un nom.

    Par exemple :
    CClient = "clients"
    CVoitures = "voitures"

    Dans mon module j'aimerai retrouver la valeur par ce genre d'instruction :
    std::string sCode = maMap[CClient];

    Est-ce que c'est possible ?


    Merci beaucoup,

    A bientôt

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Et bien je dirais que tu as soit la solution facile avec une map<string,string> :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string sCode = maMap["CClient"];
    Ou alors il y a des solutions plus évoluées mais aussi bien plus complexes à base de méta programmation.

    Il est peut-être aussi possible d'utiliser une astuce à base de valeur de retour de type_info(), mais je perso je ne recommanderais pas une telle bidouille.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Oui là justement ça reste une chaîne de caractère la clé.

    Il y a quoi comme solution ? Est-ce que il faut regarder du côté des typelist ?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Oui, c'est à ça que je pensais.
    L'ennui c'est que, d'une part, il est probable que tu doives te refaire ta propre typelist spécialisée à partir de rien. Ensuite, le stockage des chaines de caractères en tant que paramètre template ce n'est pas simple. Je crois que Boost contient quelque chose pour simplifier ça (si ça dit quelque chose à un lecteur...).

    Edit: je viens de penser à quelque chose de plus simple, à base de classes de traits:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<class A>
    struct classname {
       static const char* name="unknown";
    };
     
    template<>
    struct classname<machin> {
       static const char* name="machin";
    }
     
    ...
    Quelques macros par dessus ça et ça devrait être fonctionnel (quoique, je suis pas certain que des const char* en static ça passe correctement écrit comme ça)

    Edit2: Effectivement non, par contre de cette façon c'est bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template<class A>
    struct classname {
    	static string name() {
    		return "unknown";
    	}
    };
     
    template<>
    struct classname<machin> {
       static string name() {
    	   return "machin";
    	}
    };

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Et pourquoi pas des const std::string à la place de ces const char* ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Encore moins, j'avais un doute sur const char* mais avec une classe je suis certain que ça ne passera jamais sans définir quelque chose dans le cpp.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Ok, merci beaucoup,

    Je vais faire quelques recherches et tester 2-3 trucs.

    Merci

Discussions similaires

  1. [Google Maps] Créer une map Google avec plusieurs marqueurs
    Par Prodiguy dans le forum APIs Google
    Réponses: 1
    Dernier message: 03/05/2013, 18h21
  2. Réponses: 2
    Dernier message: 18/11/2011, 16h57
  3. Réponses: 3
    Dernier message: 29/09/2009, 12h06
  4. créer une table avec des colonnes de types différents
    Par d_hazem dans le forum Composants
    Réponses: 1
    Dernier message: 15/01/2009, 15h23
  5. Réponses: 1
    Dernier message: 18/04/2007, 23h02

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