From ab71a0c2760e3fc5d703840c7163bf90ec026eb8 Mon Sep 17 00:00:00 2001
From: Jeremie Deray <jeremie.deray@pal-robotics.com>
Date: Mon, 23 Oct 2017 16:27:49 +0200
Subject: [PATCH] serialize obj+typeid::name & fix parameter-pack

---
 src/serialization/cereal/io.h | 27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/src/serialization/cereal/io.h b/src/serialization/cereal/io.h
index afd328438..b90eacfaf 100644
--- a/src/serialization/cereal/io.h
+++ b/src/serialization/cereal/io.h
@@ -87,20 +87,35 @@ struct Extensions
   };
 };
 
-template <typename Ar, typename S, typename T, typename... Args>
-void serialize(S& stream, T&& object, Args&&... args)
+template <typename Ar>
+void serialize_pack(Ar&&)
 {
-  Ar archive(stream);
+  // end of expansion
+}
 
-  archive( cereal::make_nvp("object", std::forward<T>(object)) );
-  archive( cereal::make_nvp("object", std::forward<Args>(args))... );
+/// @todo demangle typeid.name ?
+
+template <typename Ar, typename T, typename... Args>
+void serialize_pack(Ar&& archive, T&& object, Args&&... args)
+{
+  archive( cereal::make_nvp(typeid(T).name(), std::forward<T>(object)) );
+  serialize_pack(archive, std::forward<Args>(args)...);
 }
 
 template <typename Ar, typename S, typename T>
 void serialize(S& stream, T&& object)
 {
   Ar archive(stream);
-  archive( cereal::make_nvp("object", std::forward<T>(object)) );
+  archive( cereal::make_nvp(typeid(T).name(), std::forward<T>(object)) );
+}
+
+template <typename Ar, typename S, typename T, typename... Args>
+void serialize(S& stream, T&& object, Args&&... args)
+{
+  Ar archive(stream);
+  archive( cereal::make_nvp(typeid(T).name(), std::forward<T>(object)) );
+
+  serialize_pack(archive, std::forward<Args>(args)...);
 }
 
 template <typename EXT, typename InAr, typename OutAr>
-- 
GitLab