#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct Archive {}; struct Test { template void serialzize( Archive & ) { std::cout << "hey there" << std::endl; } template void save( Archive & ) const { std::cout << "saved by the bell" << std::endl; } template void load( Archive & ) { std::cout << "locked and loaded" << std::endl; } template static Test * load_and_construct( Archive & ) { return new Test(); } }; template void serialize( Archive &, Test & ) { } template void load( Archive &, Test & ) { } template void save( Archive &, Test const & ) { } namespace cereal { template <> struct LoadAndConstruct { template static void load_and_construct( Archive &, cereal::construct & construct ) { construct(); } }; } struct A { virtual void foo() = 0; }; struct B : A { void foo() {} template void serialize( Archive & ) { std::cout << "i'm in your b" << std::endl; } }; struct C { char a; }; //CEREAL_REGISTER_TYPE(B); template static auto test(int) -> decltype( cereal::access::member_serialize( std::declval(), std::declval() ), std::true_type()) { return {}; } template static auto test(...) -> std::false_type { return {}; } int main() { typedef Test T; std::cout << std::boolalpha; // Test Load and Construct internal/external std::cout << "\tload_and_construct" << std::endl; std::cout << cereal::traits::has_member_load_and_construct::value << std::endl; std::cout << cereal::traits::has_non_member_load_and_construct::value << std::endl; // serialize std::cout << "\tserialize" << std::endl; std::cout << cereal::traits::has_member_serialize::value << std::endl; std::cout << cereal::traits::has_non_member_serialize::value << std::endl; std::cout << test(0) << std::endl; // load std::cout << "\tload" << std::endl; std::cout << cereal::traits::has_member_load::value << std::endl; std::cout << cereal::traits::has_non_member_load::value << std::endl; // save std::cout << "\tsave" << std::endl; std::cout << cereal::traits::has_member_save::value << std::endl; std::cout << cereal::traits::has_non_member_save::value << std::endl; // splittable std::cout << "\t splittable" << std::endl; std::cout << cereal::traits::has_member_split::value << std::endl; std::cout << cereal::traits::has_non_member_split::value << std::endl; // serialiable std::cout << "\toutput serializable" << std::endl; std::cout << cereal::traits::is_output_serializable::value << std::endl; std::cout << cereal::traits::is_input_serializable::value << std::endl; // specialized std::cout << "\tspecialized" << std::endl; std::cout << cereal::traits::detail::is_specialized_member_serialize::value << std::endl; std::cout << cereal::traits::detail::is_specialized_member_load_save::value << std::endl; std::cout << cereal::traits::detail::is_specialized_non_member_serialize::value << std::endl; std::cout << cereal::traits::detail::is_specialized_non_member_load_save::value << std::endl; std::cout << cereal::traits::detail::is_specialized_error::value << std::endl; std::cout << cereal::traits::is_specialized::value << std::endl; // array size std::cout << typeid(A).name() << std::endl; std::cout << typeid(cereal::traits::has_load_and_construct).name() << std::endl; // extra testing return 0; }