2011-02-15 80 views
5

我使用靴子的property_tree庫。我正在尋找從ptree對象獲取子節點的方法,但如果失敗,將返回空ptree。我在property_tree/examples/empty_ptree_trick.cpp中遇到了一個很好的例子:哪裏是boost property_tree :: empty_ptree?

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。

回答

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 ::可選類型。但我只是一個初學者..

編輯 我剛剛發現empty_ptree <的實施>。

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

我想你可以添加到您的代碼,並把它作爲在empty_ptree_trick.cpp描述,但我有我的解決辦法堅持,現在,直到我發現它實際上應該怎樣做。

+0

@expelleboy - 感謝您的努力:-)。但是,你的代碼有一些問題:1)`read_xml`也可能拋出 - 所以你可能想把它放在`try`塊中。 2)我不確定`get_child`返回的ptree的壽命是多少,但boost中的例子總是從get <>分配結果,並且永遠不會獲取它們的地址。你最終可能會有一個懸掛指針。 3)你可以跳過`try-catch`,作爲get <>的可選版本(在catch塊中使用的版本),永遠不會拋出。 4)返回對empty_ptree的引用比創建它更有效。 – bavaza 2011-03-06 09:25:05

相關問題