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 :

conversion de typelist


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Points : 13
    Points
    13
    Par défaut conversion de typelist
    Bonjour,

    Je souhaite générer une liste de type à partir d'une autre liste de type, mais je n'arrive pas à résoudre ce problème.

    J'ai une classe template basique qui pourrait servir par exemple de conteneur :
    template<class T> struct conteneur {};

    J'ai une liste de type contenant 3 types T1, T2 et T3.

    A partir de cette liste, j'aimerais générer une nouvelle liste contenant les 3 types conteneur<T1>, conteneur<T2> et conteneur<T3>.

    Je ne sais pas si cette génération de type est triviale, pour moi elle ne l'est pas. Alors y aurait-il une lib permettant de le faire, ou peut-être que quelqu'un voit comme la générer...

    Toute les pistes sont les bienvenues, merci.

    Edit : Je n'ai pas posté de code car je n'attend particulièrement la solution complète, je serai déjà bien assez content d'avoir une piste !

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je suppose que T1, T2, et T3 dérivent tous 3 de T ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Non, ce sont des types différents.
    Je veux parler d'une liste de type telle qu'elles sont définies ici http://loulou.developpez.com/tutorie...metaprog/#L4.1 , dans le but de générer des tuples, donc des conteneurs de données hétérogènes.

  4. #4
    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
    Salut,

    La seule lib qui te permettra de faire "plus facilement" des manipulations de ce genre est Boost.MPL, mais elle est pas évidente à prendre en main (y'a un bouquin qui porte quasiment que sur cette lib...).

    Mais sinon, il suffit d'utiliser quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename T>
    struct conteneurize // oui oui, le nom est nul
    {
      typedef conteneur<T> type;
    };
    en appliquant la "metafonction" (cf Boost.MPL & Boost.TypeTraits pour le vocabulaire) conteneurize à toute ta typelist. Une lib décente de typelist te fournit une metafonction genre "map" qui va appliquer une métafonction à chaque type de la liste pour te donner un nouveau type.
    Un peu comme ce que j'ai fait ici : http://alpmestan.wordpress.com/2009/...pe-lists-in-c/ avec ma structure template Map.
    Donc avec ma "Map" t'obtiendrais ta nouvelle typelist de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef Map<AncienneTypeList, conteneurize>::type NouvelleTypeList;
    si je ne m'abuse.

    EDIT : pour des conteneurs hétérogènes, t'as regardé Boost.Fusion ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup, je vais regarder ton blog ainsi que boost fusion

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 13
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par etienne.bezout Voir le message
    Bonjour,


    J'ai une liste de type contenant 3 types T1, T2 et T3.

    A partir de cette liste, j'aimerais générer une nouvelle liste contenant les 3 types conteneur<T1>, conteneur<T2> et conteneur<T3>.
    Comme le dit Alp, Boost::MPL te permet de faire ce genre d'opération,
    Par exemple, avec l'algorithme transform tu peux modifier ta liste initiale
    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
    20
    21
    22
    23
    24
    25
    26
    27
     
     
    #ifndef MPL_TEST
    #define MPL_TEST
     
    #include <boost/mpl/inherit_linearly.hpp>
    #include <boost/mpl/inherit.hpp>
    #include <boost/mpl/list.hpp>
    #include <boost/mpl/vector.hpp>
     
    #include <vector>
     
    template <typename T>
    struct ObjectHolder
    {
    	std::vector<T> elems;
    };
     
     
    typedef boost::mpl::vector<char,short,int,long,float,double> typelist;
    typedef boost::mpl::transform<
                                                typelist,ObjectHolder<boost::mpl::_1> 
    							  >::type result;
     
     
     
    #endif
    Penches toi aussi sur inherit_linearly, toujours dans la boost mpl, qui te permet de générer
    hiérarchie équivalente au tutoriel auquel tu fais référence.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Voilà à quoi j'en suis arrivé avec les libs mpl et fusion de boost :

    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
     
      template <typename T>
      struct ObjectHolder
      {
        std::vector<T> elems;
      };
     
      //! génération d'une liste de type avec mpl
      typedef boost::mpl::vector<int,string> typelist_t;
      //! transformation de la liste de type
      typedef boost::mpl::transform< typelist_t, ObjectHolder<boost::mpl::_1> >::type result_t;
      //! génération d'un tuple de boost::fusion à partir de la nouvelle liste de type
      typedef typename boost::fusion::result_of::as_vector<result_t>::type tuple_t; 
     
      //! instanciation d'un tuple de la forme "tuple< ObjectHolder<int>, ObjectHolder<string> >"
      tuple_t tuple;

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

Discussions similaires

  1. Conversion Assembleur Motorola 68xxx en Intel 80xxx
    Par markham dans le forum Autres architectures
    Réponses: 3
    Dernier message: 22/11/2002, 20h09
  2. [MSXML] Comment empécher la conversion des entités ?
    Par nima dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/11/2002, 14h14
  3. Algorithme de conversion de RTF vers HTML
    Par youtch dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/09/2002, 12h35
  4. [Conversions] Millisecondes...
    Par agh dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h25
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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