Deserialisieren ich Message mit C++ bin mit und ich versuche, das Äquivalent dieser Python Karte deserialisieren:eine heterogene Karte mit Message in C++
{'metadata': {'date': '2014-06-25', 'user_id': 501},
'values': [3.0, 4.0, 5.0],
'version': 1}
Das Objekt der obersten Ebene ist eine Karte mit String-Schlüssel , aber die Werte sind von ganz anderen Arten. Mein Code weiß im Voraus, wie die Struktur des Objekts aussehen sollte. Ich sollte in der Lage sein, eine Ganzzahl zu deklarieren und dann meinen Deserialisierungscode zu sagen, "Der Wert des Schlüssels version
ist eine ganze Zahl, also setze den Wert dieser ganzen Zahl in diese Speicheradresse."
Das Problem ist, dass ich ' Ich bin mir nicht einmal sicher, wie ich zu dem Punkt kommen kann, an dem mein C++ - Code diese Struktur als Map behandeln kann. Ich würde erwarten, etwas zu tun, wie
msgpack::unpacker unpacker;
// ...copy the data into unpacker's buffer...
msgpack::unpacked message;
std::map<std::string, anything> output_map;
unpacker.next(&message);
msgpack::object obj = message.get();
obj.convert(&output_map);
int version_number = output_map.at("version");
Gibt es eine mögliche Art (anything
), die hier funktionieren würde? Die MessagePack-Dokumentation enthält nur triviale Beispiele und this blog post ist besser, deckt diesen Anwendungsfall jedoch nicht ab.
'boost :: any' oder' boost :: variant' könnte die Aufgabe erledigen, aber dieses Problem ist eine größere Designfrage als Sie denken, Ihre Karte könnte eine andere Karte als eines ihrer Mitglieder haben, also werden Sie letztendlich brauche eine komplett rekursive Map, die mehr oder weniger ein Baum ist. Die meisten JSON-Parsing-Bibliotheken erstellen ihren eigenen benutzerdefinierten Typ zum Speichern dieser Art von Daten – Drax