Как отличить операцию чтения / записи в ускоренной сериализации? - PullRequest
12 голосов
/ 08 сентября 2010

Используя библиотеку повышения сериализации У меня есть очень простая 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;
}

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

1 Ответ

24 голосов
/ 28 октября 2010

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

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");

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

...