From 41d3098f8ef2e5e202f6512e4a278e7caf701da4 Mon Sep 17 00:00:00 2001 From: Shane Grant Date: Thu, 4 Jul 2013 17:54:03 -0700 Subject: [PATCH] Fixed a bug relating to overload resolution for loading types. ProcessImpl was taking a universal reference and the type traits were failing on T& as opposed to a T. loading's processimpl now only takes refs. we still let op() take r-values in case someone passes it an nvp or something --- include/cereal/cereal.hpp | 20 ++++++++++---------- sandbox_rtti.cpp | 38 +++++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/include/cereal/cereal.hpp b/include/cereal/cereal.hpp index d9ab2f30..40acbaaa 100644 --- a/include/cereal/cereal.hpp +++ b/include/cereal/cereal.hpp @@ -230,7 +230,7 @@ namespace cereal //! Serialization of a virtual_base_class wrapper /*! \sa virtual_base_class */ template inline - ArchiveType & processImpl(virtual_base_class b) + ArchiveType & processImpl(virtual_base_class const & b) { traits::detail::base_class_id id(b.base_ptr); if(itsBaseClassSet.count(id) == 0) @@ -244,7 +244,7 @@ namespace cereal //! Serialization of a base_class wrapper /*! \sa base_class */ template inline - ArchiveType & processImpl(base_class b) + ArchiveType & processImpl(base_class const & b) { self->processImpl( *b.base_ptr ); return *self; @@ -450,7 +450,7 @@ namespace cereal //! Serialization of a virtual_base_class wrapper /*! \sa virtual_base_class */ template inline - ArchiveType & processImpl(virtual_base_class b) + ArchiveType & processImpl(virtual_base_class & b) { traits::detail::base_class_id id(b.base_ptr); if(itsBaseClassSet.count(id) == 0) @@ -464,7 +464,7 @@ namespace cereal //! Serialization of a base_class wrapper /*! \sa base_class */ template inline - ArchiveType & processImpl(base_class b) + ArchiveType & processImpl(base_class & b) { self->processImpl( *b.base_ptr ); return *self; @@ -476,7 +476,7 @@ namespace cereal typename std::enable_if() || (traits::is_input_serializable() && traits::has_member_serialize()), ArchiveType &>::type - processImpl(T && t) + processImpl(T & t) { access::member_serialize(*self, t); return *self; @@ -487,9 +487,9 @@ namespace cereal typename std::enable_if() || (traits::is_input_serializable() && traits::has_non_member_serialize()), ArchiveType &>::type - processImpl(T && t) + processImpl(T & t) { - serialize(*self, std::forward(t)); + serialize(*self, t); return *self; } @@ -498,7 +498,7 @@ namespace cereal typename std::enable_if() || (traits::is_input_serializable() && traits::has_member_load()), ArchiveType &>::type - processImpl(T && t) + processImpl(T & t) { access::member_load(*self, t); return *self; @@ -509,9 +509,9 @@ namespace cereal typename std::enable_if() || (traits::is_input_serializable() && traits::has_non_member_load()), ArchiveType &>::type - processImpl(T && t) + processImpl(T & t) { - load(*self, std::forward(t)); + load(*self, t); return *self; } diff --git a/sandbox_rtti.cpp b/sandbox_rtti.cpp index 681a3661..9e1fc13a 100644 --- a/sandbox_rtti.cpp +++ b/sandbox_rtti.cpp @@ -153,12 +153,23 @@ struct DerivedVirtual : public virtual BaseVirtual } }; +struct TestType +{ + int x; + template + void serialize( Archive & ar ) + { + ar( x ); + }; +}; + namespace cereal { template struct specialize {}; + template struct specialize {}; } -//CEREAL_REGISTER_TYPE(DerivedVirtual); +CEREAL_REGISTER_TYPE(DerivedVirtual); template void nop(T&&) {} @@ -166,19 +177,20 @@ int main() { std::cout << std::boolalpha; - std::cout << cereal::traits::is_specialized_member_load_save() << std::endl; - //std::cout << cereal::traits::is_specialized_non_member_serialize() << std::endl; - std::cout << cereal::traits::is_output_serializable() << std::endl; - //std::cout << cereal::traits::has_non_member_serialize() << std::endl; - //std::cout << cereal::traits::is_specialized_member_serialize() << std::endl; - std::cout << cereal::traits::has_member_serialize() << std::endl; + std::cout << cereal::traits::is_specialized_member_load_save() << std::endl; + std::cout << cereal::traits::is_specialized_member_load_save() << std::endl; + //std::cout << cereal::traits::is_specialized_non_member_serialize() << std::endl; + //std::cout << cereal::traits::is_input_serializable() << std::endl; + //std::cout << cereal::traits::has_non_member_serialize() << std::endl; + //std::cout << cereal::traits::is_specialized_member_serialize() << std::endl; + std::cout << cereal::traits::has_member_serialize() << std::endl; + std::cout << "sssssssssssss" <() << std::endl; - std::cout << cereal::traits::is_non_const_member_save() << std::endl; - std::cout << cereal::traits::detail::has_member_save_any() << std::endl; - std::cout << cereal::traits::has_non_member_save() << std::endl; - std::cout << cereal::traits::has_member_serialize() << std::endl; - std::cout << cereal::traits::has_non_member_serialize() << std::endl; + + std::cout << cereal::traits::has_member_load() << std::endl; + //std::cout << cereal::traits::has_non_member_load() << std::endl; + std::cout << cereal::traits::has_member_serialize() << std::endl; + //std::cout << cereal::traits::has_non_member_serialize() << std::endl; {