Polymere map
-
Hallo allerseits!
In meinem Framework muss ich eine große Anzahl an Parametern übergeben. Genauer gesagt habe ich eine Klasse, welche sehr viele Parameter besitzt und erstelle von dieser Klasse sehr viele Objekte, welche sich in ihren Parametern unterscheiden.
Dies möchte ich lösen, indem ich der Klasse eine Map mit den verschiedenen Parametern übergebe, mit einem string als key (auch um den Code leserlich und verständlich zu halten, um zu wissen welcher Parameter abgefragt wird)
Einfach gemacht, ich löse das ganze temporär mit strings:
std::map<std::string, std::string> mymap; mymap["myInteger"] = "1"; mymap["myString"] = "foo"; mymap["myDouble"] = "1.0"; mymap["myBool"] = "false";welche ich dann in der Klasse geziehlt auslese
int myInteger = atoi(mymap["myInteger"].c_str()); std::string myString = mymap["myString"]; double myDouble = atof(mymap["myDouble"].c_str()); bool myBool = false; if(mymap["myBool"] == "true") myBool = true;Das ganze funktioniert natürlich, ist aber nicht sonderlich elegant. Die Frage ist nun also, wie ich eine polymere Map erstellen kann, in der ich direkt verschiedene Typen speichern kann, ohne sie dann danach mittels des strings zu setzen. Also sowas wie:
std::map<std::string, ANYTYPE> mymap; mymap["myInteger"] = 1; mymap["myString"] = "foo"; mymap["myDouble"] = 1.0; mymap["myBool"] = false;welche ich dann in der Klasse geziehlt auslese
int myInteger = mymap["myInteger"]; std::string myString = mymap["myString"]; double myDouble = mymap["myDouble"]; bool myBool = mymap["myBool"];Ich kenne schon den Ansatz mit einer Basisklasse, von der ich einige Klassen ableite und dann letztlich in die Map Objekte der Basis Klasse einfüge, und somit die verschiedenen Typen in einer Map storen kann. Aber ich möchte hier nur standardklassen verwenden (wie gezeigt int, string, double, bool).
Ist das irgendwie möglich?
-
Im Standard gibts es dafür nichts. Mit boost::variant kannst du sowas machen. http://www.boost.org/doc/libs/1_48_0/doc/html/variant.html
-
Mir kam gerade noch eine andere Idee. Im Prinzip könnte man die Map ja auch auf eine andere Klasse übertragen. Sowas wie
class MyParameters { public: int myInteger; std::string myString; double myDouble; bool myBool; }; MyParameters::MyParameters() { myInteger = 1; myString = "foo"; myDouble = 1.0; myBool = true; }Und dann dieses myParamters Objekt übergeben.