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 :

comment convertir "toto" en attribut toto


Sujet :

C++

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut comment convertir "toto" en attribut toto
    Bonjour,

    Je souhaite initialiser des attributs d'une classe (par exemple int m_toto) depuis un fichier externe. En parsant le fichier externe j'obtiens le nom des attributs à initialiser et leur valeurs, par ex: "m_toto" "int" "4", mais je ne sais pas comment faire pour dire au compilateur:
    tu vois la chaine de caractère "m_toto" et bien il faut prendre l'attribut m_toto de type int et lui donner la valeur 4 qui est de type int.

    Je ne cherche pas à convertir une string représentant un nombre en int mais bien à convertir une string en attribut (ou son adresse)

    Est-ce possible ?

    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Un petit google au sujet de la notion de réflexion? En c++ ça ne fait pas partie du langage...
    la question est: as-tu vraiement besoin d'un parseur universel? Combien de classes différentes dans les objets que tu initialiseras à partir de ton fichier? Si la réponse tient sur les doigts d'une main, et qu'elles ont quelques attributs chacune, pourqoi ne pas le coder en dur?

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

    Informations professionnelles :
    Activité : aucun

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

    C'est possible, mais pas de manière simple, du moins, si tu veux automatiser les choses et pouvoir avoir les attributs dans n'importe quel ordre...

    Il faudrait en effet passer par une map dont la clé serait la chaine de caractère et la valeur un pointeur de fonction (ou un foncteur) qui permettrait d'appeler le mutateur correspondant, pour autant qu'il existe, et avec tous les problèmes que cela peut comporter, en terme de compatibilité de types

    Par contre, vu que tu es dans une phase de lecture, tu te rapproche du problème de sérialisation / désérialisation.

    Et là, le problème est tout autre, car, pour sérialiser ou désérialiser un objet, il faut avant tout avoir une spécification sur le format du fichier, non seulement le format "de base" (xml vs CSV vs binaire vs tout ce que tu veux) mais aussi concernant l'ordre d'apparition des différentes valeurs dans le fichier.

    La première donnée ("toto") servirait alors de "balise" permettant de vérifier que l'ordre établi est respecté, la deuxième (int) deviendrait inutile et la troisième (4) correspondrait à la valeur à utiliser.

    L'idéal, si tu fais tout à la main étant, bien entendu, d'avoir un constructeur reprenant l'ensemble des attributs

    Ceci dit, il y a une bibliothèque géniale qui fait la sérialisation pour toi dans n'importe quel format "classique" (sous la forme de fichier texte simple, de fichier xml ou de fichier binaire) : boost serialization

    Si tu as l'occasion de définir toi meme les spécifications du fichier, je te conseille vraiment de te tourner vers cette bibliothèque : tu verras, en cinq minutes, tu auras un résultat nikel
    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

  4. #4
    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,
    boost.serialisation, comme le propose Koala, me semble aussi la solution la plus naturelle.

    Cependant si ton besoin n'est pas celui-ci mais vraiment liée à la reflexion, il faut utiliser une bibliothèque dédiée car rien n'existe en standard en C++. CAMP a été proposée par un de nos éminents contributeurs il y a quelques temps

  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 : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    boost.serialisation, comme le propose Koala, me semble aussi la solution la plus naturelle.

    Cependant si ton besoin n'est pas celui-ci mais vraiment liée à la reflexion, il faut utiliser une bibliothèque dédiée car rien n'existe en standard en C++. CAMP a été proposée par un de nos éminents contributeurs il y a quelques temps
    Y'a pas eu un commit depuis 1 an, c'est toujours supporté par la société qu'il y avait derrière ?
    "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
    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
    Citation Envoyé par Davidbrcz Voir le message
    Y'a pas eu un commit depuis 1 an, c'est toujours supporté par la société qu'il y avait derrière ?
    Je ne sais pas. J'ai posé la question à Laurent mais je n'ai pas encore eu de réponse. Je soupçonne que non. Ca n'empêche pas son utilisation...

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