Я думаю, что вы можете сделать это без разделения, что было бы обычным способом:
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");
Я бы немного осторожнее полагался на что-то подобное, хотя - множественное наследование может сломать его, если кто-то напишет архив, которыйделает и ввод, и вывод и , мне не ясно, насколько важной и публичной должна быть эта часть интерфейса.