将对象放到boost :: property_tree的正确方法是什么?

时间:2011-09-27 18:13:48

标签: c++ boost boost-propertytree

请考虑以下示例:

#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'

有人能建议正确的方法吗?

1 个答案:

答案 0 :(得分:3)

只需为您的operator<<对象类型创建一个重载Foo。这可以通过创建一个函数来完成,该函数接收Foo对象类型的成员,并通过operator<<将它们传递给ostream对象类型。这是一个非常简单的例子:

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

这是有效的,因为您用作int对象类型成员的Foo类型正在为operator<<和{{1}调用ostream的重载版本}}。因此,如果属于int类型的对象尚未超载,那么您还必须为这些类型创建重载的Foo函数。

完成后,您可以在任何地方调用您的代码:

operator<<

此外,任何其他尝试将Foo test; cout << test; //will print out whatever the values of "egg" and "bar" are operator<<对象和ostream类型用作操作数的代码也将正常运行。

最后,您可以Foo重载函数并将其放在头文件中,或者您可以在头文件中创建函数声明,然后在其他地方的代码模块中定义函数。