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 :

get avec type générique: templates, boost::variant, metaprogramming, autre ?


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 8
    Points
    8
    Par défaut get avec type générique: templates, boost::variant, metaprogramming, autre ?
    Bonjour à tous,

    Je souhaiterais me définir une stucture de donné qui contienne un ensemble de paramètres. Chacun de ces paramètres est identifié par un identifiant unique (un string) et est associé à une valeure qui peux être a priori de n'importe quel type.

    Pour l'interface de ma structure de donnée, je voudrait pouvoir y ajouter des paramètre de n'importe quel type (ou du moins faisant partie d'un liste de type prédéfinie), qqch dans le style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double foo=1.0;
    my_class bar;
    ParameterSet.add_parameter("t",foo);
    ParameterSet.add_parameter("a",bar);
    Ensuite, je souhaiterais pouvoir récuperer les valeurs typées de ces paramètres a partir de leurs identifiants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double foo2=ParamSet.get_parameter("t");
    my_class bar2=ParamSet.get_parameter("a");
    J'ai commencé à regarder du coté du type boost::variant dans l'objectif de faire qqch dans le gout de ce qui suit.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    #include <vector>
     
    #include <map>
    #include "boost/variant.hpp"
     
    using namespace std;
     
    typedef boost::variant
    <
    int,
    double,
    std::string,
    vector<int>
    > param_value_type;
     
    class ParamSet {
    public:
        void add_param(string id, param_value_type val) {
            map_.insert(pair<string, param_value_type>(id, val));
        };
        map<string,param_value_type> map_;
    };
     
    int main(int argc, char** argv){
     
        int i=2;
        double d=1.2;
        string s="plop";
     
        ParamSet paramset;
        paramset.add_param("i",i);
        paramset.add_param("d",d);
        paramset.add_param("s",s);
     
        int i2=boost::get<int>(paramset.map_["i"]);
        double d2=boost::get<double>(paramset.map_["d"]);
        string s2=boost::get<string>(paramset.map_["s"]);
     
        cout << "i2=" << i2 << endl;
        cout << "d2=" << d2 << endl;
        cout << "s2=" << s2 << endl;
     
    }
    Ce qui ne me convient pas dans cet exemple: pour récuperer les valeurs typées des paramètres, je voudrais que l'utilisateur n'ai pas à s'embéter avec la syntaxe de boost. Je voudrais que l'utilisation de boost soit gérée en interne dans la classe ParamSet et remplacer en gros:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int i2=boost::get<int>(paramset.map_["i"]);
    Par une méthode avec un syntaxe du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int i2=paramset.get("i");
    Merci d'avance pour votre aide!

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par janou195 Voir le message
    Ce qui ne me convient pas dans cet exemple: pour récuperer les valeurs typées des paramètres, je voudrais que l'utilisateur n'ai pas à s'embéter avec la syntaxe de boost. Je voudrais que l'utilisation de boost soit gérée en interne dans la classe ParamSet et remplacer en gros:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int i2=boost::get<int>(paramset.map_["i"]);
    Par une méthode avec un syntaxe du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int i2=paramset.get("i");
    Merci d'avance pour votre aide!
    Impossible : le compilateur a besoin de savoir quelle fonction get() appeler. Pour faire son choix, il dispose des informations suivantes :

    1) le type de paramset
    2) le type des arguments.

    Il ne prends PAS en compte le type de retour de get(), parce que le type de retour de get et le type de l'instance dans laquelle est stockée ce type de retour n'est pas la même et il n'existe pas nécessairement de lien logique entre ces types (par ex, get() peut renvoyer un const char* et i36 peut être un std::string).

    Etant donné que toutes les fonctions get() sont membres de paramset et que toutes les fonctions get() prennent en paramètre une chaine ce caractère, le compilateur ne peut pas déterminer celle qui va lui être utile.

    Du coup, tu est obligé d'utiliser la notation get<Type>("param").
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Merci pour ta réponse, j'ai donc fait autrement.

  4. #4
    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
    Essaye de réfléchir à la possibilité d'avoir la valeur de retour comme argument de la fonction. Cela permettrait d'indiquer implicitement le type attendu lors de l'appel de la fonction.

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour

    Ca ressemble beaucoup à boost.PropertyMap ce que tu souhaites faire, non ?

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par oodini Voir le message
    Essaye de réfléchir à la possibilité d'avoir la valeur de retour comme argument de la fonction. Cela permettrait d'indiquer implicitement le type attendu lors de l'appel de la fonction.
    Ca revient à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TYPE var;
    init_var(var,paramset);
    ....
     
    template<class T>
    void init_var(TYPE &, ParamSet const&);
    C'est embêtant comme approche. Ca dissocie la définition de la variable de son initialisation effective. Du coup, ça empêche parfois de rendre une variable constante qui devrait l'être : TYPE const var = boost::get<TYPE>(paramset.map_["i"]);

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

Discussions similaires

  1. operator<< avec type générique
    Par allezlolo dans le forum Débuter
    Réponses: 2
    Dernier message: 17/12/2009, 21h36
  2. Problème de type avec les génériques
    Par othebault dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2009, 14h59
  3. retour du type générique avec réflexion
    Par maxeur dans le forum C#
    Réponses: 2
    Dernier message: 03/07/2009, 14h05
  4. type générique avec héritage multiple
    Par apqmwnqmap dans le forum Langage
    Réponses: 4
    Dernier message: 13/03/2008, 14h56
  5. [2.0] polymorphisme avec des types générique
    Par mister3957 dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 31/05/2007, 08h11

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