diff --git a/sandbox.cpp b/sandbox.cpp index 0f90046b..a222f44d 100644 --- a/sandbox.cpp +++ b/sandbox.cpp @@ -43,7 +43,9 @@ class Base { - private: + + public: + //private: friend class cereal::access; template void serialize( Archive & ar ) @@ -54,7 +56,7 @@ class Base int x; }; -class Derived : public Base +class Derived : private Base { public: //friend class cereal::access; @@ -247,32 +249,93 @@ namespace cereal }; } +template +struct has_size_method +{ +private: + typedef std::true_type yes; + typedef std::false_type no; + + template static auto test(int) -> decltype(std::declval().size(), yes()); + + template static no test(...); + +public: + + static constexpr bool value = std::is_same(0)),yes>::value; +}; +#include +template +struct has_serialize_method +{ +private: + typedef std::true_type yes; + typedef std::false_type no; + + template static auto test(int) -> decltype(std::declval().serialize(std::declval()), yes()); + //template static auto test(int) -> decltype( access::member_serialize(std::declval()std::declval().serialize(std::declval()), yes()); + //decltype( access::member_serialize(std::declval(), std::declval() ) ) + + template static no test(...); + +public: + + static constexpr bool value = std::is_same(0)),yes>::value; +}; + +struct B +{ + int size(); +}; + +struct C : private B +{ + +}; + + // ###################################################################### int main() { std::cout << std::boolalpha << std::endl; - std::cout << "Base" << std::endl; - std::cout << "ms " << cereal::traits::has_member_save() << std::endl; - std::cout << "nms " << cereal::traits::has_non_member_save() << std::endl; - std::cout << "ml " << cereal::traits::has_member_load() << std::endl; - std::cout << "nml " << cereal::traits::has_non_member_load() << std::endl; - std::cout << "mse " << cereal::traits::has_member_serialize() << std::endl; - std::cout << "nse " << cereal::traits::has_non_member_serialize() << std::endl; - std::cout << "iser " << cereal::traits::is_input_serializable() << std::endl; - std::cout << "oser " << cereal::traits::is_output_serializable() << std::endl; - std::cout << std::endl; + //std::cout << "Base" << std::endl; + //std::cout << "ms " << cereal::traits::has_member_save() << std::endl; + //std::cout << "nms " << cereal::traits::has_non_member_save() << std::endl; + //std::cout << "ml " << cereal::traits::has_member_load() << std::endl; + //std::cout << "nml " << cereal::traits::has_non_member_load() << std::endl; + //std::cout << "mse " << cereal::traits::has_member_serialize() << std::endl; + //std::cout << "nse " << cereal::traits::has_non_member_serialize() << std::endl; + //std::cout << "iser " << cereal::traits::is_input_serializable() << std::endl; + //std::cout << "oser " << cereal::traits::is_output_serializable() << std::endl; + //std::cout << std::endl; - std::cout << "Derived" << std::endl; - std::cout << "ms " << cereal::traits::has_member_save() << std::endl; - std::cout << "nms " << cereal::traits::has_non_member_save() << std::endl; - std::cout << "ml " << cereal::traits::has_member_load() << std::endl; - std::cout << "nml " << cereal::traits::has_non_member_load() << std::endl; - std::cout << "mse " << cereal::traits::has_member_serialize() << std::endl; - std::cout << "nse " << cereal::traits::has_non_member_serialize() << std::endl; - std::cout << "iser " << cereal::traits::is_input_serializable() << std::endl; - std::cout << "oser " << cereal::traits::is_output_serializable() << std::endl; - std::cout << std::endl; + //std::cout << "Derived" << std::endl; + //std::cout << "ms " << cereal::traits::has_member_save() << std::endl; + //std::cout << "nms " << cereal::traits::has_non_member_save() << std::endl; + //std::cout << "ml " << cereal::traits::has_member_load() << std::endl; + //std::cout << "nml " << cereal::traits::has_non_member_load() << std::endl; + //std::cout << "mse " << cereal::traits::has_member_serialize() << std::endl; + //std::cout << "nse " << cereal::traits::has_non_member_serialize() << std::endl; + //std::cout << "iser " << cereal::traits::is_input_serializable() << std::endl; + //std::cout << "oser " << cereal::traits::is_output_serializable() << std::endl; + //std::cout << std::endl; + std::stringstream os; + cereal::BinaryOutputArchive archive(os); + + std::cout << has_size_method::value << std::endl; + std::cout << has_size_method::value << std::endl; + //std::cout << has_serialize_method::value << std::endl; + //std::cout << has_serialize_method::value << std::endl; + //std::cout << has_serialize_method::value << std::endl; + + //Derived d; + //d.serialize( archive ); + //decltype(cereal::access::member_serialize(archive, d)); + //decltype(std::declval().serialize( std::declval() )); + //d.serialize( archive ); + + //std::cout << "ms2 " << cereal::traits::has_member_serialize2(std::declval(), std::declval()) << std::endl; //{ // int x[5];