Как правильно поместить объекты в boost :: property_tree? - PullRequest
1 голос
/ 27 сентября 2011

Рассмотрим следующий пример:

#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 Ответ

3 голосов
/ 27 сентября 2011

Просто создайте перегруженный operator<< для вашего Foo типа объекта.Это можно сделать, создав функцию, которая принимает члены вашего Foo типа объекта и передает их через operator<< в ostream тип объекта.Вот очень простой пример:

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

Это работает, потому что типы int, которые вы используете в качестве членов вашего Foo типа объекта, вызывают перегруженную версию operator<< для ostream и int.Поэтому, если объекты, являющиеся частью вашего Foo типа, еще не перегружены, вам также придется создавать перегруженные operator<< функции для этих типов.

Как только это будет сделано, ваш код можетвызываться в любом месте следующим образом:

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

Кроме того, любой другой код, который пытается использовать operator<< с объектом ostream и вашим типом Foo в качестве операндов, также будет работать правильно.

Наконец, вы можете либо inline перегруженной функции и поместить ее в заголовочный файл, либо вы можете создать объявление функции в заголовке, а затем определить функцию в модуле кода где-то еще.

...