Лучший способ сделать снимок объекта в файл - PullRequest
1 голос
/ 11 ноября 2008

Какой лучший способ вывести общедоступное содержимое объекта в читабельный файл? Я ищу способ сделать это, чтобы не требовалось, чтобы я знал всех членов класса, а использовал компилятор, чтобы сообщить мне, какие члены существуют и как их зовут. Должны быть макросы или что-то в этом роде, верно?

Придуманный пример:

class Container
{
public:
    Container::Container() {/*initialize members*/};
    int stuff; 
    int otherStuff;
};
Container myCollection;

Я хотел бы иметь возможность что-то сделать, чтобы увидеть вывод в соответствии с "myCollection: stuff = value, otherStuff = value". Но затем, если в Контейнер добавлен другой член,

class Container
{
public:
    Container::Container() {/*initialize members*/};
    int stuff;
    string evenMoreStuff;
    int otherStuff;
};
Container myCollection;

На этот раз выводом этого снимка будет «myCollection: stuff = value, evenMoreStuff = value, otherStuff = value»

Есть ли макрос, который помог бы мне достичь этого? Это вообще возможно? (Также я не могу изменить класс Container.) Еще одно замечание: меня больше всего интересует потенциальный макрос в VS, но приветствуются и другие решения.

Ответы [ 7 ]

2 голосов
/ 11 ноября 2008

Boost имеет библиотеку сериализации, которая может сериализоваться в текстовые файлы. Однако теперь вы не сможете обойтись, зная, какие члены содержит класс. Вам понадобится отражение, которого нет в C ++.

2 голосов
/ 11 ноября 2008

То, что вы ищете, это "[отражение] (http://en.wikipedia.org/wiki/Reflection_(computer_science)#C.2B.2B)".

Я нашел две многообещающие ссылки с поиском в Google для "C ++ отражение":

http://www.garret.ru/cppreflection/docs/reflect.html

http://seal -reflex.web.cern.ch / уплотнительное кольцо-рефлекс / index.html

1 голос
/ 11 ноября 2008

Я бы настоятельно рекомендовал взглянуть на протокольные буферы Google .

1 голос
/ 11 ноября 2008

Что вам нужно, это сериализация объекта или маршалинг объекта. рекуррентная тема в стеке потока.

1 голос
/ 11 ноября 2008

Взгляните на эту библиотеку .

0 голосов
/ 12 ноября 2008

XDR - это один из способов сделать это независимо от платформы.

0 голосов
/ 11 ноября 2008

К сожалению, нет макроса, который может сделать это для вас. То, что вы ищете, это библиотека отражающих типов. Они могут варьироваться от довольно простых до домашних чудовищ, которым нет места в рабочей среде.

Реального простого способа сделать это не существует, и хотя у вас может возникнуть соблазн просто сбросить память по адресу, подобному этому:

char *buffer = new char[sizeof(Container)];
memcpy(buffer, containerInstance, sizeof(Container));

Я бы действительно советовал против этого, если только у вас нет простых типов.

Если вы хотите что-то действительно простое, но не полное, я бы предложил написать свой printOn(ostream &) метод члена.

...