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:
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:
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:
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:
int i2=boost::get<int>(paramset.map_["i"]);
Par une méthode avec un syntaxe du style:
Code:
int i2=paramset.get("i");
Merci d'avance pour votre aide!