6

ブーツの property_tree ライブラリを使用しています。オブジェクトから子ノードを取得する方法を探していますが、失敗した場合ptreeは空を返します。ptreeproperty_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 でブースト 1.44 を使用しています。

4

2 に答える 2

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;

私が拾うことができたものから、彼らは私たちがboost::optionalタイプを使用することを期待しています. しかし、私はただの初心者です..

編集 empty_ptree<> の実装を見つけました。

template<class Ptree>
    inline const Ptree &empty_ptree()
    {
        static Ptree pt;
        return pt;
    }

これをコードに追加して、empty_ptree_trick.cpp で説明されているように使用できると思いますが、実際にどのように実行する必要があるかがわかるまで、今のところ私のソリューションに固執しています。

于 2011-03-04T17:53:44.637 に答える