Ho letto la documentazione per boost :: property_tree e non ho trovato un modo per aggiornare o unire un ptree con un altro ptree. Come faccio a fare questo?Come faccio a unire/aggiornare un boost :: property_tree :: ptree?
Dato il seguente codice, come sarebbe la funzione update_ptree?
#include <iostream>
#include <boost/property_tree/ptree.hpp>
using boost::property_tree::ptree;
class A
{
ptree pt_;
public:
void set_ptree(const ptree &pt)
{
pt_ = pt;
};
void update_ptree(const ptree &pt)
{
//How do I merge/update a ptree?
};
ptree get_ptree()
{
return pt_;
};
};
int main()
{
A a;
ptree pt;
pt.put<int>("first.number",0);
pt.put<int>("second.number",1);
pt.put<int>("third.number",2);
a.set_ptree(pt);
ptree pta = a.get_ptree();
//prints "0 1 2"
std::cout << pta.get<int>("first.number") << " "
<< pta.get<int>("second.number") << " "
<< pta.get<int>("third.number") << "\n";
ptree updates;
updates.put<int>("first.number",7);
a.update_ptree(updates);
pta = a.get_ptree();
//Because the update_tree function doesn't do anything it just prints "0 1 2".
//I would like to see "7 1 2"
std::cout << pta.get<int>("first.number") << " "
<< pta.get<int>("second.number") << " "
<< pta.get<int>("third.number") << "\n";
return 0;
}
Ho pensato di iterare sul nuovo ptree e di usare "put" per inserire valori. Ma "put" richiede un tipo e non so come ottenere quell'informazione dal nuovo ptree e usarlo come argomento per il vecchio ptree.
Una cosa che ho provato nella funzione update_ptree sta usando:
pt_.add_child(".",pt);
Fondamentalmente cerco di aggiungere il pt come un bambino alla radice del pt_. Sfortunatamente questo non sembra funzionare.
Qualche idea?
Sono grato per qualsiasi aiuto.
Grazie.
(ho cercato di aggiungere il tag e property_tree ptree a questa domanda, ma non mi era permesso a)
Grazie. Questa è una soluzione interessante. Compilerai una visita! Ma cosa intendi con "è possibile avere più nodi con lo stesso percorso"? Tree_1 = "a.b.c" = 0 aggiornamento albero Tree_2 = "a.b.c" = 1, "a.b.d" = 2. Verrà aggiornato solo "a.b.d" = 2? (Eseguire il debug e vedere) – mantler
È possibile avere più di un nodo con esattamente lo stesso percorso. Quando Tree_1 contiene "a.b.c" = 1, "a.b.c" = 2 e Tree_2 contiene "a.b.c" = 1, dopo aver aggiornato Tree_2 con Tree_1, Tree_2 conterrà "a.b.c" = 2. –
Questo è un bel pezzo di codice. Come sapevi che questo operatore avrebbe funzionato su path_type ?: 'ptree :: path_type curPath = childPath/ptree :: path_type (it-> first);' Non riesco a vedere che l'opeator è definito nella documentazione. – 2NinerRomeo