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 :

Ecrire et lire une énumération.


Sujet :

Langage C++

  1. #1
    Invité
    Invité(e)
    Par défaut Ecrire et lire une énumération.
    Salut, ayant presque terminé mon système de sérialisation, je suis confronté à un dernier problème et je me demande quelle est la meilleur façon de le résoudre.

    J'essaye d'écrire et lire une énumération dans un flux, j'ai essayé ce code, malheureusement, cela ne fonctionne pas :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <typename E,
        class... D,
        class = typename std::enable_if<!std::is_fundamental<D>::value>::type,
        class = typename std::enable_if<std::is_enum<E>::value>::type>
        void operator() (E& data, D...) {
            buffer<<data<<std::endl;
        }

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    template <typename E,
                class... D,
                class = typename std::enable_if<!std::is_fundamental<E>::value>::type,
                class = typename std::enable_if<std::is_enum<E>::value>::type>
        void operator()(E& data, D...) {
            buffer>>data;
            char space;
            buffer.get(space);
        }

    Mais ça ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /usr/local/include/odfaeg/Core/archive.h|647|error: cannot bind ‘std::istream {aka std::basic_istream<char>}’ lvalue to ‘std::basic_istream<char>&&’|
    Puis je écrire une énumération et lire directement une énumération dans un ifstream ou bien suis je obligé de passer par un système qui écrit un entier pour chaque valeur de l'énumération,


    Bref, quel est la façon la meilleure façon de faire ?

  2. #2
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Si c'est un enum simple (pas forcement conseillé en c++11) il n'y a pas de problème.
    Pour un enum class, un simple static_cast<char>(enum_value) devrait faire l'affaire.
    Bien evidemment static_cast<EnumType>(char_value) pour le recuperer.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ok, bah là je viens de faire un satic_cast pour une simple enum et ça fonctionne, apparemment il m'écris un nombre dans le fichier qui correspond à la valeur de l'élément de l'enumération :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void operator()(E& data, D...) {
            int eVal;
            buffer>>eVal;
            data = static_cast<E>(eVal);
            char space;
            buffer.get(space);
        }

    Par contre je n'ai pas essayé avec les enum class.

    Bref je peux enfin lire et écrire à peu près tout les types, il n'y a que les wchar_t et les wstring que je ne peux pas, mais ça, c'est pas une priorité, je ne sais pas très bien comment ce genre de type fonctionne peut être je devrait convertir chaque caractère en une variable de type short et les écrire mais ça, c'est un autre sujet.

  4. #4
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Hmm quand même curieux qu'il faille un static_cast pour un enum.

    J'avoue avoir du mal à saisir.
    J'ai essaillé de passer par des templates et tout, ça marche toujours..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //==============================================================================
    #include <iostream>
    //------------------------------------------------------------------------------
    enum Enum { VALUE_0 };
    //==============================================================================
    int main()
    {
        std::cout << Enum::VALUE_0;
        return 0;
    }
    //==============================================================================
    Cela est censé passer.. !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Lors de l'écriture oui ça passe mais pas lors de la lecture, là, il faut faire un cast.

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

Discussions similaires

  1. Ecrire et lire des données d'une classe
    Par rtg57 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 03/04/2010, 19h11
  2. Réponses: 9
    Dernier message: 22/01/2007, 14h23
  3. [Composants][Animation] Lire une vidéo compressée
    Par femtosa dans le forum Composants VCL
    Réponses: 6
    Dernier message: 03/09/2002, 08h03
  4. [TP]lire une ligne de l'ecran et la stocker dans une chaine
    Par Bleuarff dans le forum Turbo Pascal
    Réponses: 26
    Dernier message: 02/07/2002, 10h08
  5. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11

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