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

SL & STL C++ Discussion :

Utilisation d'un std::queue<void*>


Sujet :

SL & STL C++

  1. #1
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut Utilisation d'un std::queue<void*>
    Bonjour, je suis un gros boulet, je ne sais pas utiliser un conteneur de la STL pour des structures de données différentes.
    Je souhaite pouvoir ajouter dans la file des int, string, char*, long, unsigned char*, ... bref un peu tout ce qui est types de base, mais aussi des tableaux de string aussi.
    En faisant le push d'un const char* la compilation m'a engueulé, et tout bonnement j'ai casté en void*. Est ce une bonne méthode et le contenu sera t'il correctement utilisable par la suite ?!

    On m'a aussi dit de faire ma classe pour gérer les erreurs, mais la classe Queue est déjà faite je ne vois pas en quoi ce serait utile...

    bref une question de première année j'ai honte

    merci !

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Hum si c'est des types de bases à la rigueur tu fais un queue d'union. Sinon une solution plus C++ serait de stocker des boost::variant. (si tu as un nombres fixés de type à stocker sinon boost::any).

    Enfin, en général ça relève plus d'une erreur de conception d'avoir ce genre de besoin...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Je refactorise sans pouvoir changer le code incriminé
    Le code envoi une succession de données par ex int, string, int, int, float, char* en passant par des méthodes dédiées. J'aimerai récupérer tout ça petit à petit dans une file à traiter à la fin pour voir ce qui a été donné.
    Je pensais passer sinon par une classe abstraite AbstractParameter mis dans la file et avec chaque type différent stocké dans des classes héritant de cette classe abstraite...Je vais voir ce que ça donne, ça paraît sympa mais je suis sûr que ça va clocher quelque part!

    Merci pour les explications sinon : j'ai juste pas suivi le truc de l'union (ça existe en C++ encore? ou alors ça correspond à ma classe abstraite)
    et Boost je crois que je ne peux pas l'installer mais je vais peut être me lancer là dedans pour apprendre

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Points : 393
    Points
    393
    Par défaut
    Salut,

    Si j'ai bien compris tu cherche un moyen d'avoir une fonction qui stocke dans la std::queue des éléments de types différents?

    Si c'est ce que tu cherche regarde du côté des template. Un exemple d'une fonction qui peut stocker n'importe quel type de données :

    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
     
    template <typename T> class Queue
    {
     
    public : /*.....*/  
           void stocke(const T& element);
     
    private:
           std::queue<T> _myQueue;
    };
     
    ////
     
    template<typename T>
    void
    stocke(const T& element)
    {
          _myQueue.push(element);
    }

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par atm0sfe4r Voir le message
    Salut,

    Si j'ai bien compris tu cherche un moyen d'avoir une fonction qui stocke dans la std::queue des éléments de types différents?

    Si c'est ce que tu cherche regarde du côté des template. Un exemple d'une fonction qui peut stocker n'importe quel type de données :

    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
     
    template <typename T> class Queue
    {
     
    public : /*.....*/  
           void stocke(const T& element);
     
    private:
           std::queue<T> _myQueue;
    };
     
    ////
     
    template<typename T>
    void
    stocke(const T& element)
    {
          _myQueue.push(element);
    }
    Il parle d'une collection hétérogène. Ce que tu donnes c'est une collection homogène
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    voilà c'est ça...car la std::queue donne déjà une forme de pile sous forme template, je pense que je n'aurais pas eu à reimplémenter une file.

    Merci quand même!

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Il serai possible de faire ce que tu veux, mais avec une classe à toi.
    Cette classe prend le pointeur sur ton élément à stocker ( void* )
    et un flag pour indiquer le type.
    Car une fois que tu sors les élément de la queue, il faut que tu sache ce que c'était avant, pour faire le bon cast pour pouvoir réutiliser les éléments...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Je suis en train de l'implémenter merci.
    Quand je vais utiliser la file et défiler les éléments par contre, je suppose que je ne pourrais pas faire un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void displayQueue (std::queue<Parameter> paramQueue)
    {
    // pour tout les éléments de la file :
    cout << reinterpret_cast <paramQueue.getType() *> (paramQueue.getValue()) ; // !
    }

  9. #9
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Non car :
    1/ getType() retournerait une valeur (un entier ou tout ce que tu veux, mais pas un type.
    2/ un paramètre template doit être connu à la compilation : 5, 'a', std::string sont des paramètres template valides (5 est un entier, connu à la compil... de même pour 'a' mais de type char, et std::string est un nom de type qui est connu à la compilation pour peu que <string> soit inclu (indirectement ou directement)).

    A la rigueur, std::queue<boost::any> (ou std::queue<boost::variant<T1,T2,T3,T4, ..., TN> > si tu as un nombre *fini* de types que tu veux pouvoir stocker dans ta std::queue).

    Mais je pense que ça coince quelque part. Pour quelle raison veux-tu faire ça ? (stocker des éléments de types différents dans un même conteneur)

    PS : en C++ sauf si l'on est vraiment obligé, on évite de se trimballer des void*. Les templates et le polymorphisme d'héritage (selon le cas) remplacent avantageusement void*.

  10. #10
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Oui c'est bien ce que je pensais...mon programme n'utilise pas Boost, je vais l'installer si je peux. En fait sinon il faudrait tout simplement que je fasse un cast précisément selon le type donné.

    Pourquoi tout ça ? car j'ai un module qui fait appel à une dll en donnant successivement des valeurs sous différents types: un nombre fini oui (uchar, int, string, ...) une quinzaine tout au plus. Je dois récupérer ces données pour les traiter à part. A part la file permettant de tout stocker pour l'utiliser ensuite, je ne vois pas comment procéder. J'ai bien d'autres idées mais celle ci me semblait plus appropriée.
    Je vais revoir ma conception.

    Merci tout de même à tous pour les explications.

  11. #11
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Tu peux bien évidemment caster un boost::any/variant vers le type que tu veux... Sauf que tu ne sais pas exactement quel type a l'élément que tu veux récupérer. Donc ça renvoie une exception pour les cast version références, et un pointeur nul pour les versions pointeurs.

  12. #12
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    J'ai fait une std::queue<Param*> où Param est ma classe dans laquelle on donne une void* value et un string type. Pour réutiliser la file il suffit de recasté dans le bon type connu par le string type donné.
    Pour l'instant ça me suffit, j'arrangerai ça plus tard en faisant plus joli...

    Merci à tous !

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

Discussions similaires

  1. Nettoyer des std::queue en une fonction template
    Par gassi64 dans le forum SL & STL
    Réponses: 16
    Dernier message: 23/07/2009, 15h05
  2. std::queue très rapide !?
    Par rulianf dans le forum Langage
    Réponses: 2
    Dernier message: 19/06/2009, 17h52
  3. Valeur innatendue avec std::queue::front()
    Par Krishna dans le forum SL & STL
    Réponses: 3
    Dernier message: 29/12/2008, 14h37
  4. mutex ou ne pas mutex, doit-on protéger les std::queue
    Par bleuerouge dans le forum SL & STL
    Réponses: 3
    Dernier message: 20/07/2008, 18h28

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