Estoy usando boots_tree library. Estoy buscando una manera de obtener un nodo hijo desde un objeto ptree
, pero devuelvo un ptree
vacío si falla. Me encontré con un buen ejemplo en property_tree/ejemplos/empty_ptree_trick.cpp:donde se encuentra boost property_tree :: empty_ptree?
void process_settings(const std::string &filename)
{
ptree pt;
read_info(filename, pt);
const ptree &settings = pt.get_child("settings", empty_ptree<ptree>());
std::cout << "\n Processing " << filename << std::endl;
std::cout << " Setting 1 is " << settings.get("setting1", 0) << std::endl;
std::cout << " Setting 2 is " << settings.get("setting2", 0.0) << std::endl;
std::cout << " Setting 3 is " << settings.get("setting3", "default") << std::endl;
}
que hace exactamente lo que necesito. El problema es que el compilador se queja de que la función empty_ptree()
no es miembro de boost:property_tree
. ¿Alguna idea de dónde es empty_ptree()
?
Estoy usando boost 1.44 en VS2010.
@expelleboy - gracias por el esfuerzo :-). Sin embargo, hay algunos problemas con el código sugerido: 1) 'read_xml' también puede arrojar, por lo que es posible que desee colocarlo en el bloque' try'. 2) No estoy seguro de cuál es la vida útil del elemento pree devuelto por 'get_child', sin embargo, los ejemplos en boost siempre asignan el resultado de get <> y nunca toman su dirección. Puede terminar con un puntero colgando. 3) puedes omitir el 'try-catch', como la versión opcional de get <> (la que se usa en tu bloque catch), nunca se lanza. 4) Es más eficiente devolver una referencia al empty_ptree que crearla. – bavaza
@bavaza np. En realidad, había tratado estos problemas creando una clase (xml_branch en mi código) que heredé que me obliga a crear instancias solo dentro de una clase que hereda xml_branch, o un puntero a un pree. La clase raíz tiene el ptree real y su puntero. A continuación, la raíz maneja todas las excepciones planteadas en la inicialización del miembro xml_branch's. Lamentablemente, no puedo mostrarle la fuente completa, pero puedo decir que es una forma bastante elegante de hacerlo. – expelledboy
Perdón, quise decir "la sucursal se encarga de todas las excepciones ...", pero parece que no puedo editar mi comentario. – expelledboy