我正在使用boots的property_tree库。我正在寻找一种从ptree
对象获取子节点的方法,但如果失败则返回空ptree
。我在property_tree / examples / empty_ptree_trick.cpp中遇到了一个很好的例子:
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;
}
完全符合我的需要。问题是编译器抱怨empty_ptree()
函数不是boost:property_tree
的成员。 empty_ptree()
是什么意思?
我在VS2010上使用boost 1.44。
答案 0 :(得分:1)
我刚刚吹了整整一天试图回答这个问题!
这是我的解决方案。首先我使用指针,而不是引用,因为你必须立即初始化它们。然后我抓住了异常并添加了一个新的ptree。
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 :: optional类型。但我只是一个初学者..
修改强> 我刚刚找到了empty_ptree&lt;&gt;。
的实现template<class Ptree>
inline const Ptree &empty_ptree()
{
static Ptree pt;
return pt;
}
我认为您可以将其添加到您的代码中并按照empty_ptree_trick.cpp中的描述使用它,但我现在仍然坚持使用我的解决方案,直到我发现它实际上应该如何完成。
答案 1 :(得分:0)
void process_settings(const std::string &filename)
{
ptree pt;
read_info(filename, pt);
const ptree &settings = pt.get_child("settings", 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;
}
请注意,这将防止抛出'boost :: wrapexceptboost :: property_tree :: ptree_bad_path'的实例