2011-09-27 74 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

相关问题