boost property_tree :: empty_ptree在哪里?

bav*_*aza 5 boost-propertytree

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

这完全符合我的需要.问题是编译器抱怨empty_ptree()函数不是其成员boost:property_tree.任何想法在哪里empty_ptree()

我在VS2010上使用boost 1.44.

exp*_*boy 2

我花了一整天的时间来回答这个问题!

这是我的解决方案。首先,我使用指针,而不是引用,因为您必须立即初始化它们。然后我就捕获了异常并添加了一个新的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;
Run Code Online (Sandbox Code Playgroud)

据我所知,他们希望我们使用 boost::Optional 类型。但我只是一个初学者..

编辑 我刚刚找到了empty_ptree<>的实现。

template<class Ptree>
    inline const Ptree &empty_ptree()
    {
        static Ptree pt;
        return pt;
    }
Run Code Online (Sandbox Code Playgroud)

我认为您可以将其添加到您的代码中并按照empty_ptree_trick.cpp中的描述使用它,但我现在坚持使用我的解决方案,直到我找出它实际上应该如何完成。