Для @ cdhow ie вот два примера результирующей простоты (с помощью методов шаблона load_and_save_data):
Здесь mMembers - это std :: unorderedmap (см. Save_and_load_data в вопросе выше , У меня также есть один для контейнеров starndard):
void CHexArea::load_and_save()
{
this->load_and_save_data((char&)mColor);
this->load_and_save_data(mTouchLeft);
this->load_and_save_data(mTouchRight);
this->load_and_save_data(mTouchBottom);
this->load_and_save_data(mTouchTop);
this->load_and_save_data(mMembers);
}
Здесь в настройках есть две версии файлов:
void CHexPreferences::load_and_save()
{
if( this->is_loading() ) {
this->reset(); // version's forward compatibility
}
int version = 2;
this->load_and_save_data(version);
this->load_and_save_data(mBoardOrientation);
this->load_and_save_data(mBoardSize);
this->load_and_save_data(mComputerStarts);
this->load_and_save_data(mComputerInitialTurns);
if( version >= 2) {
this->load_and_save_data(mComputerTilesPerTurn);
}
this->load_and_save_data(mDebugFlags);
}
Простой и понятный.
Конечно, есть два метода ( load () и save () ), которые являются внешним интерфейсом и вызывают те, что указаны выше, но: 1. Они являются частью библиотеки. (не нужно их переписывать, ОО как обычно) и 2. Ядро загрузки / сохранения записывается только один раз в load_save_data, с преимуществом простоты и с соответствующим кодом загрузки и сохранения (типы, порядок ...).
Конечно, есть минусы, но я надеюсь, вы увидите, что некоторым людям может быть разумно думать, что есть (ИМХО, очень сильные) плюсы.
Остальное это дело вкуса.