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 :

Stocker une liste d'arguments de types différents sans "perdre" le typage


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut Stocker une liste d'arguments de types différents sans "perdre" le typage
    Bonjour,

    Je voudrais stocker une liste d'arguments dans une std::list mais le problème c'est que je ne sais pas comment m'y prendre pour faire en sorte de pouvoir mettre des arguments de types différents, tout en étant capable ensuite, au moment où j'utiliserais la liste, de connaitre le type des différents éléments stockés.

    J'ai pensé aux templates mais le problème c'est que je ne peux avoir qu'une liste de données du même type. J'ai également pensé à un truc dans ce style :

    class A {}
    template<typename T> class B : public A { T m_Data; }

    et ensuite créer une liste de A* :
    std::list<A*> listA;

    ... ce qui pourrait convenir pour stocker les données dans ce style :
    B<int> * pb = new B<int>;
    listA.push_back(pb);

    .. mais le problème c'est qu'ensuite je ne pourrais plus récupérer les données correctement, à moins de connaitre explicitement leur type (ce qui n'est pas le cas évidemment, puisque ça change à chaque exécution).

    Si quelqu'un a une solution (qui m'éviterais de devoir stocker explicitement le type de chaque donnée et ensuite de faire des tests du genre if (nType == 1) alors c'est un int, 2 c'est un float, 3 c'est une string etc...), je suis preneur.

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    2nde solution (une classe mere dont herite toutes tes classes et une liste d'objets de type ta classe mere) + Dynamic_cast a la sortie

    Si le dynamic_cast renvoie autre chose que 0, tu viens de trouver le type de ce qui est sorti.
    Si le dynamic_cast renvoie 0, c'est pas le bon type, tu peux tenter le type d'apres.

    Cf la FAQ pour plus d'informations sur la syntaxe et l'utilisation de dynamic_cast

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut
    Citation Envoyé par Ksempac
    2nde solution (une classe mere dont herite toutes tes classes et une liste d'objets de type ta classe mere) + Dynamic_cast a la sortie

    Si le dynamic_cast renvoie autre chose que 0, tu viens de trouver le type de ce qui est sorti.
    Si le dynamic_cast renvoie 0, c'est pas le bon type, tu peux tenter le type d'apres.

    Cf la FAQ pour plus d'informations sur la syntaxe et l'utilisation de dynamic_cast
    Oui, mais si j'ai bien compris l'idée, je serais quand même obligé de faire des tests pour chaque valeur du genre : si dynamic_cast<int> (valeur) == NULL alors ce n'est pas un int etc... Or, je voudrais éviter de faire ces tests. J'ai pensé qu'il y'avait sûrement moyen de faire ça d'un façon plus concise et plus optimisée en utilisant les templates mais je ne vois pas comment.

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par aiolia_aiolos
    .. mais le problème c'est qu'ensuite je ne pourrais plus récupérer les données correctement, à moins de connaitre explicitement leur type (ce qui n'est pas le cas évidemment, puisque ça change à chaque exécution).
    Qu'est-ce que tu veux faire avec des valeurs si tu n'en connais pas le type? Une fois qu'on sait ca, on peut commencer a proposer des solutions.

  5. #5
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Qu'est-ce que tu veux faire avec des valeurs si tu n'en connais pas le type? Une fois qu'on sait ca, on peut commencer a proposer des solutions.
    Je bosse sur une surcouche de LUA et je dois créer une fonction qui prend en argument la liste de paramètres et effectue, pour chaque valeur de la liste, des traitements spécifiques de lua (lua_pushstring, lua_pushnumber etc...) en fonction du type de la valeur.

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Je ne vois pas en quoi une solution du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class A {
    public:
       virtual void act() = 0;
    };
     
    class AInt {
       ...
       void act() {lua_pushint(data); }
    };
     
    class AString {
       ...
       void act() {lua_pushstring(data); }
    };
    ne convient pas.

  7. #7
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Je ne vois pas en quoi une solution du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class A {
    public:
       virtual void act() = 0;
    };
     
    class AInt {
       ...
       void act() {lua_pushint(data); }
    };
     
    class AString {
       ...
       void act() {lua_pushstring(data); }
    };
    ne convient pas.
    Le problème c'est que ça m'oblige à instancier des classes différentes, or je dois stocker toutes les instances dans une seule liste, donc elle doivent être obligatoirement de même type (enfin si j'ai bien compris, en plus la classe A n'est pas parent des autres)

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par aiolia_aiolos
    Le problème c'est que ça m'oblige à instancier des classes différentes, or je dois stocker toutes les instances dans une seule liste, donc elle doivent être obligatoirement de même type (enfin si j'ai bien compris, en plus la classe A n'est pas parent des autres)
    A devait etre parent des autres, c'est un oubli que je vais corriger (sinon, a quoi servirait-elle?)

    Tu continues a stocker des pointeurs vers A.

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

Discussions similaires

  1. type d'une colonne pour stocker une liste d'IDs
    Par zozor241 dans le forum Débuter
    Réponses: 1
    Dernier message: 07/04/2013, 19h18
  2. Réponses: 7
    Dernier message: 28/01/2011, 10h09
  3. Stocker une liste d'objets personnalisés dans les settings
    Par laville dans le forum Général Dotnet
    Réponses: 12
    Dernier message: 13/12/2007, 11h14
  4. Stocker une liste dans un fichier
    Par Knuckles dans le forum Général Python
    Réponses: 1
    Dernier message: 29/05/2006, 08h08

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