Разделение методов сохранения и загрузки не означает, что вам нужно хранить две копии кода сериализации. Вы можете разделить их, а затем снова присоединить к ним с помощью общей функции.
private:
friend class boost::serialization::access;
BOOST_SERIALIZATION_SPLIT_MEMBER()
template <class Archive>
void save(Archive& ar, const unsigned int version) const {
const_cast<Example*>(this)->common_serialize(ar, version);
}
template <class Archive>
void load(Archive& ar, const unsigned int version) {
common_serialize(ar, version);
sqrt_num = -1;
}
template <class Archive>
void common_serialize(Archive& ar, const unsigned int version) {
ar & num;
}
Вы, наверное, заметили const_cast
. Это неудачное предостережение для этой идеи. Хотя функция-член serialize
неконстантна для сохранения операций, функция-член save
должна быть константной. Пока объект, который вы сериализуете, изначально не был объявлен как const, его безопасно отбрасывать, как показано выше. В документации кратко упоминается необходимость разыгрывания константных членов ; это похоже.
С учетом вышеуказанных изменений ваш код будет правильно печатать «2» как для ex1
, так и для ex2
, и вам потребуется только одна копия кода сериализации. Код load
содержит только код, специфичный для повторной инициализации внутреннего кэша объекта; функция save
не затрагивает кеш.