где находится boost property_tree :: empty_ptree? - PullRequest
5 голосов
/ 15 февраля 2011

Я использую библиотеку ботинок 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() есть?

Я использую повышение 1,44 на VS2010.

1 Ответ

1 голос
/ 04 марта 2011

Я только что провел целый день, пытаясь ответить на этот вопрос!

Это было мое решение. Во-первых, я использовал указатели, а не ссылки, так как вы должны немедленно их инициализировать. Тогда я просто поймал исключение и добавил новое дерево.

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, но я пока придерживаюсь своего решения, пока не выясню, как на самом деле это должно быть сделано.

...