Я только что провел целый день, пытаясь ответить на этот вопрос!
Это было мое решение. Во-первых, я использовал указатели, а не ссылки, так как вы должны немедленно их инициализировать. Тогда я просто поймал исключение и добавил новое дерево.
using namespace boost::property_tree;
ptree r_pt;
ptree *c_pt;
read_xml( "file.xml" , r_pt);
try {
c_pt = &(r_pt.get_child( "example" ));
}
catch (ptree_bad_path) {
c_pt = &(r_pt.put_child( "example", ptree() ));
}
std::cout << "Setting 1 is " << c_pt.get("setting1", 0) << std::endl;
Из того, что я мог понять, они ожидают, что мы будем использовать тип boost :: необязательный. Но я только начинающий ..
EDIT
Я только что нашел реализацию empty_ptree <>.
template<class Ptree>
inline const Ptree &empty_ptree()
{
static Ptree pt;
return pt;
}
Я думаю, что вы можете просто добавить это к своему коду и использовать его, как описано в empty_ptree_trick.cpp, но я пока придерживаюсь своего решения, пока не выясню, как на самом деле это должно быть сделано.