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 �clair� 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
    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 Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    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...

  3. #3
    Membre �clair� 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
    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 �clair�
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    268
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    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 Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    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

  6. #6
    Membre �clair� 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
    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
    27 131
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 131
    Billets dans le blog
    150
    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 �clair� 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
    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 confirm�

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    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 �clair� 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
    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 confirm�

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    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 �clair� 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
    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