Tôi nghĩ bạn có thể làm điều này mà không cần tách, đó sẽ là cách thông thường:
if (Archive::is_saving::value)
doSomething();
này được thừa hưởng từ giao diện cơ sở rằng việc sử dụng Lưu trữ, trong boost/archive/detail/interface_[ia]archive.hpp
Các mã sau đây chứng minh rằng nó có vẻ là một giải pháp hợp lý với 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");
Tôi sẽ thận trọng khi dựa vào một cái gì đó như thế này mặc dù - nhiều trong di sản có thể phá vỡ nó nếu ai đó đã viết một kho lưu trữ mà cả đầu vào và đầu ra và nó không rõ ràng với tôi như thế nào permenant và công cộng phần này của giao diện có nghĩa là phải.
nếu bạn không ngại chia logic thành hai chức năng, hãy xem http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/serialization.html#splitting – Ammar