Подтвердить что ты не робот

Как отличить операцию чтения/записи в сериализации boost?

Используя библиотеку сериализации boost, у меня есть очень простая функция-член serialize(), что-то вроде:

template <class Archive>
  void serialize( Archive& ar, unsigned version )
  {
     ar & m_Searcher;
  }

... и я хочу, чтобы это было так просто (я не хочу, в частности, использовать разделение). Но в случае написания я хочу сделать некоторую "подготовку" для m_Searcher до фактического написания.

{
  if( this-is-a-writing-operation )
     do-some-preparation( m_Searcher )

  ar & m_Searcher;
}

Есть ли простой способ отличить операции чтения и записи?

4b9b3361

Ответ 1

Я думаю, вы можете сделать это без разделения, что было бы обычным способом:

if (Archive::is_saving::value) 
   doSomething();

Это унаследовано от базового интерфейса, используемого Архивами, в boost/archive/detail/interface_[ia]archive.hpp

Следующий код демонстрирует, что это разумное решение с 1.42

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>

// oarchive:
//text
static_assert(!boost::archive::text_oarchive::is_loading::value, "out is loading");
static_assert(boost::archive::text_oarchive::is_saving::value, "out isn't saving");

//xml
static_assert(!boost::archive::xml_oarchive::is_loading::value, "out is loading");
static_assert(boost::archive::xml_oarchive::is_saving::value, "out isn't saving");

// iarchive:
//text
static_assert(boost::archive::text_iarchive::is_loading::value, "out is loading");
static_assert(!boost::archive::text_iarchive::is_saving::value, "out isn't saving");

//xml
static_assert(boost::archive::xml_iarchive::is_loading::value, "out is loading");
static_assert(!boost::archive::xml_iarchive::is_saving::value, "out isn't saving");

Я бы немного осторожно полагался на что-то вроде этого - множественное наследование может сломать его, если кто-то написал архив, который делает как входные, так и выходные данные, и мне не ясно, как permenant и public эта часть интерфейса должен быть.