2011-09-27 146 views
1

考慮下面的例子:什麼是正確的方法來把對象提升:: property_tree?

#include <boost\property_tree\ptree.hpp> 
#include <boost/any.hpp> 

typedef boost::property_tree::ptree PT; 

struct Foo 
{ 
    int bar; 
    int egg; 
    Foo(): bar(), egg() {} 
}; 


int main() 
{ 
    Foo foo; 
    foo.bar = 5; 
    PT pt; 
    pt.put<Foo>("foo", foo); 
    return 0; 
} 

我是新來振奮,我很願意把Foo對象爲屬性樹。上面的例子不能編譯,給了一個錯誤:

c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/boost/property_tree/stream_translator.hpp:33:13: error: no match for 'operator<<' in 's << e'

任何人都可以提出這樣做​​的正確方法?

回答

3

只需爲您的Foo對象類型創建一個超載的operator<<。這可以通過創建一個函數來完成,該函數使用Foo對象類型的成員,並通過operator<<將它們傳遞給ostream對象類型。這是一個很簡單的例子:

ostream& operator<<(ostream& out, Foo output_object) 
{ 
    out << egg << " " << bar; 
    return out; 
} 

這工作,因爲你正在使用作爲您Foo對象類型的成員int類型調用的operator<<重載版本ostreamint。因此,如果屬於Foo類型的對象尚未超載,那麼您也必須爲這些類型創建超載的operator<<函數。

一旦做到這一點,你的代碼可以被調用的任何地方,像這樣:

Foo test; 
cout << test; //will print out whatever the values of "egg" and "bar" are 

此外,該attemps任何其他代碼使用operator<<ostream對象和你Foo類型的操作數將正常工作,以及。

最後,您可以將重載的函數放在一個頭文件中,也可以在頭文件中創建函數聲明,然後在其他地方的代碼模塊中定義該函數。

+0

那麼,如果你有一個運算符<<用std :: ostream重載了這個對象的其他目的,你應該怎麼做呢?就像如果你在'property_tree'中存儲的格式應該看起來不同於你用來顯示它的目的? –

+0

@NicolBolas:我還有另外一個選擇嗎?我沒有看到你可以爲std :: ostream重載'operator <<'兩次,一次針對'boost :: property_tree'中的特定實例,另一個針對'std :: cout'等。我唯一能想到的是調查是否存在'boost :: property_tree'用於I/O的某種類型的派生類,您可以使用它來創建'operator <<'的更具體的重載。否則,你可能會將'std :: cout'包裝到另一個類中,併爲''Foo'類和'std :: cout'包裝器重載'operator <<'。任何其他選項? – Jason

相關問題