Ответ 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 эта часть интерфейса должен быть.