首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost property_tree::empty_ptree在哪里?

boost property_tree::empty_ptree在哪里?
EN

Stack Overflow用户
提问于 2011-02-15 20:19:07
回答 2查看 4.2K关注 0票数 6

我正在使用boots的property_tree库。我正在寻找一种从ptree对象获取子节点的方法,但如果失败,则返回一个空的ptree。我在property_tree/examples/empty_ptree_trick.cpp中遇到了一个很好的示例:

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

发布于 2011-03-05 01:53:45

我已经浪费了一整天的时间来回答这个问题!

这是我的解决方案。首先,我使用了指针,而不是引用,因为你必须立即初始化它们。然后我捕获了异常并添加了一个新的ptree。

代码语言:javascript
复制
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<>的实现。

代码语言:javascript
复制
template<class Ptree>
    inline const Ptree &empty_ptree()
    {
        static Ptree pt;
        return pt;
    }

我认为你可以将它添加到你的代码中,并按照empty_ptree_trick.cpp中的描述使用它,但我现在坚持我的解决方案,直到我弄清楚它实际上是如何完成的。

票数 2
EN

Stack Overflow用户

发布于 2020-12-01 08:40:24

代码语言:javascript
复制
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‘的实例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5003549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档