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!