sto usando MessagePack con C++ e sto cercando di deserializzare l'equivalente di questo Python mappa:deserializzazione una mappa eterogenea con MessagePack in C++
{'metadata': {'date': '2014-06-25', 'user_id': 501},
'values': [3.0, 4.0, 5.0],
'version': 1}
L'oggetto di livello superiore è una mappa con le chiavi di stringa , ma i valori sono di tipi completamente diversi. Il mio codice sa in anticipo quale dovrebbe essere la struttura dell'oggetto; Dovrei essere in grado di dichiarare un numero intero e poi dire al mio codice di deserializzazione, "Il valore della chiave version
è un numero intero, quindi metti il valore di tale numero intero in questo indirizzo di memoria."
Il problema è che I ' Non sono nemmeno sicuro di come arrivare al punto in cui il mio codice C++ può trattare questa struttura come una mappa. Mi aspetto di fare qualcosa di simile
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");
C'è qualche tipo di possibile (anything
) che avrebbe funzionato qui? La documentazione di MessagePack ha solo esempi banali, e this blog post è migliore ma non copre questo caso d'uso.
'boost :: any' o' boost :: variant' potrebbe fare il lavoro, ma questo problema è una domanda di progettazione più grande di quanto pensi, la tua mappa potrebbe avere un'altra mappa come uno dei suoi membri, quindi alla fine serve una mappa completamente ricorsiva, che è più o meno un albero. La maggior parte delle librerie di analisi JSON finisce per creare il proprio tipo personalizzato per archiviare questo tipo di dati – Drax