Creo que se puede hacer esto sin división, lo que sería la forma habitual:
if (Archive::is_saving::value)
doSomething();
Esto se hereda de la interfaz de la base de que el uso de Archivos, en boost/archive/detail/interface_[ia]archive.hpp
El código siguiente muestra que parece ser una solución razonable con 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");
me gustaría ser un poco prudente de confiar en algo como esto, aunque - en múltiples la herencia podría romperlo si alguien escribió un archivo que hace tanto entrada como salida y, no me queda claro cuán permanente y pública debe ser esta parte de la interfaz.
si no te importa dividir la lógica en dos funciones, mira http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/serialization.html#splitting – Ammar