diff --git a/include/cereal/types/memory.hpp b/include/cereal/types/memory.hpp index 77f8a18a..43a31140 100644 --- a/include/cereal/types/memory.hpp +++ b/include/cereal/types/memory.hpp @@ -74,7 +74,8 @@ namespace cereal typename std::enable_if::value, void>::type save( Archive & ar, std::weak_ptr const & ptr ) { - ar( detail::make_ptr_wrapper( ptr ) ); + auto sptr = ptr.lock(); + ar( detail::make_ptr_wrapper( sptr ) ); } //! Loading std::weak_ptr for non polymorphic types @@ -82,7 +83,9 @@ namespace cereal typename std::enable_if::value, void>::type load( Archive & ar, std::weak_ptr & ptr ) { - ar( detail::make_ptr_wrapper( ptr ) ); + std::shared_ptr sptr; + ar( detail::make_ptr_wrapper( sptr ) ); + ptr = sptr; } //! Saving std::unique_ptr for non polymorphic types @@ -121,8 +124,7 @@ namespace cereal //! Loading std::shared_ptr, case when user load and allocate (wrapper implementation) template inline - typename std::enable_if::value - && traits::has_load_and_allocate(), void>::type + typename std::enable_if(), void>::type load( Archive & ar, detail::PtrWrapper &> & wrapper ) { auto & ptr = wrapper.ptr; @@ -144,8 +146,7 @@ namespace cereal //! Loading std::shared_ptr, case when no user load and allocate (wrapper implementation) template inline - typename std::enable_if::value - && !traits::has_load_and_allocate(), void>::type + typename std::enable_if(), void>::type load( Archive & ar, detail::PtrWrapper &> & wrapper ) { auto & ptr = wrapper.ptr; @@ -166,33 +167,9 @@ namespace cereal } } - //! Saving std::weak_ptr (wrapper implementation) - template inline - typename std::enable_if::value, void>::type - save( Archive & ar, detail::PtrWrapper const &> const & wrapper ) - { - auto & ptr = wrapper.ptr; - - auto sptr = ptr.lock(); - ar( sptr ); - } - - //! Loading std::weak_ptr (wrapper implementation) - template inline - typename std::enable_if::value, void>::type - load( Archive & ar, detail::PtrWrapper &> & wrapper ) - { - auto & ptr = wrapper.ptr; - - std::shared_ptr sptr; - ar( sptr ); - ptr = sptr; - } - //! Saving std::unique_ptr (wrapper implementation) template inline - typename std::enable_if::value, void>::type - save( Archive & ar, detail::PtrWrapper const &> const & wrapper ) + void save( Archive & ar, detail::PtrWrapper const &> const & wrapper ) { auto & ptr = wrapper.ptr; ar( *ptr ); @@ -200,8 +177,7 @@ namespace cereal //! Loading std::unique_ptr, case when user provides load_and_allocate (wrapper implementation) template inline - typename std::enable_if::value - && traits::has_load_and_allocate(), void>::type + typename std::enable_if(), void>::type load( Archive & ar, detail::PtrWrapper &> & wrapper ) { auto & ptr = wrapper.ptr; @@ -210,8 +186,7 @@ namespace cereal //! Loading std::unique_ptr, case when no load_and_allocate (wrapper implementation) template inline - typename std::enable_if::value - && !traits::has_load_and_allocate(), void>::type + typename std::enable_if(), void>::type load( Archive & ar, detail::PtrWrapper &> & wrapper ) { auto & ptr = wrapper.ptr; diff --git a/sandbox_rtti.cpp b/sandbox_rtti.cpp index d1623460..74b91978 100644 --- a/sandbox_rtti.cpp +++ b/sandbox_rtti.cpp @@ -29,7 +29,25 @@ #include #include -struct MyType {}; +struct Base +{ + virtual void foo() = 0; + + template + void serialize(Archive & ar) + { + } +}; + +struct MyType : public Base +{ + void foo() {} + + template + void serialize(Archive & ar) + { + } +}; CEREAL_BIND_TO_ARCHIVES(MyType); @@ -37,6 +55,16 @@ template void nop(T&&t) {} int main() { + cereal::BinaryOutputArchive archive(std::cout); + //auto ptr = std::make_shared(); + + + std::shared_ptr const ptr(new int); + + archive(cereal::detail::make_ptr_wrapper(ptr)); + + //cereal::detail::PtrWrapper > &> + }