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 zu nlohmann::json ginge es mit std::visit: https://en.cppreference.com/w/cpp/utility/variant/visit


Log in to reply