Vermeidung von switch-case durch generischen Ansatz
-
Hallo community,
ich möchte in einem c++-17-Projekt switch-case Anweisungen vermeiden und eine generischere Lösung bevorzugen, weiß aber nicht richtig wie ich es machen soll.
Beim Einlesen einer json-Datei muss ich die einzelnen Datentypen durchgehen und den Wert in einen variant-type casten:
...
...
nlohmann::json::value_t type = msgData[JSON_VALUE].type();
var_object vObjectVal;
//var_object ist eine variant (ab C++-17) typedef std::variant<ushort, ulong, double, std::string, bool, int, uint, float> var_object;
int nMsgValue = 0;try { ... ... switch(type) { case nlohmann::json::value_t::number_integer: vObjectVal = static_cast<int>(msgData[JSON_VALUE]); break; case nlohmann::json::value_t::number_unsigned: vObjectVal = static_cast<uint>(msgData[JSON_VALUE]); break; case nlohmann::json::value_t::number_float: vObjectVal = static_cast<float>(msgData[JSON_VALUE]); break; ... ... } } ... ...
Wie kann man das smarter sprich generischer mit z.B. Vererbung, Polymorphismus, variadic templates, etc. machen?
Danke für die Hilfe!Gruß,
Zentaurus
-
Ich kann es gerade nicht testen, aber geht nicht einfach:
auto& v = msgData[JSON_VALUE]; vObjectVal = v;
?
-
@Zentaurus sagte in Vermeidung von switch-case durch generischen Ansatz:
Wie kann man das smarter sprich generischer mit z.B. Vererbung, Polymorphismus, variadic templates, etc. machen?
Wenn ich deine Frage richtig verstanden habe, und in der
nlohmann::json
Library nichts übersehen, dann gar nicht.
Es ginge, wenn der Source-Typ eine "visit" Funktion hätte.In der anderen Richtung, also von
std::variant
zunlohmann::json
ginge es mitstd::visit
: https://en.cppreference.com/w/cpp/utility/variant/visit