Следуя замечательному предложению Петра, я расширил его решение, чтобы оно было совместимо также с тривиально сериализуемыми типами boost (int, char, double ...).
Здесь, после моего индивидуального решения.
Ура и спасибо!
#include <type_traits>
#include <utility>
#include <vector>
#include <list>
#include <array>
#include <cassert>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/is_bitwise_serializable.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/array.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/set.hpp>
#include <boost/type_traits.hpp>
struct Arc
{
};
struct Foo
{
int pippo = 0;
friend class boost::serialization::access;
template <class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar &pippo;
}
};
struct Bar
{
};
template <typename...>
using void_t = void;
template <typename Type, typename Archive = boost::archive::binary_oarchive, typename = void_t<>>
struct is_boost_serializable_base : std::false_type
{
};
template <class Type, typename Archive>
struct is_boost_serializable_base<Type, Archive,
void_t<decltype(std::declval<Type &>().serialize(std::declval<Archive &>(), 0))>>
: std::true_type
{
};
template <typename Type, typename Archive>
struct is_boost_serializable_base<Type, Archive,
typename std::enable_if<boost::serialization::is_bitwise_serializable<Type>::value>::type>
: std::true_type
{
};
template <typename Type, typename Archive = boost::archive::binary_oarchive, typename = void_t<>>
struct is_boost_serializable
: is_boost_serializable_base<Type, Archive>
{
};
template <typename Type, typename Archive>
struct is_boost_serializable<Type, Archive, void_t<typename Type::value_type>>
: is_boost_serializable<typename Type::value_type, Archive>
{
};
template <typename Type>
struct is_boost_serializable<Type, boost::archive::binary_oarchive, void_t<typename Type::value_type>>
: is_boost_serializable<typename Type::value_type, boost::archive::binary_oarchive>
{
};
int main()
{
static_assert(is_boost_serializable<Foo, Arc>::value, "!");
static_assert(is_boost_serializable<std::vector<std::list<std::array<Foo, 8>>>, Arc>::value, "!");
static_assert(is_boost_serializable<std::vector<std::list<std::array<int, 8>>>, Arc>::value, "!");
static_assert(not is_boost_serializable<std::vector<std::list<std::array<Bar, 8>>>, Arc>::value, "!");
}