Penso che si possa fare questo senza scissione, che sarebbe il solito modo:
if (Archive::is_saving::value)
doSomething();
Questa è ereditata dall'interfaccia di base che gli archivi uso, in boost/archive/detail/interface_[ia]archive.hpp
Il codice seguente dimostra che sembra essere una soluzione ragionevole 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");
sarei un po 'cauto di basarsi su qualcosa di simile anche se - più in l'eredità potrebbe spezzarla se qualcuno ha scritto un archivio che fa sia input che output e non mi è chiaro quanto sia permenente e pubblica questa parte dell'interfaccia.
se non ti dispiace dividere la logica in due funzioni, dai un'occhiata a http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/serialization.html#splitting – Ammar