[serialization] Workarounds for serialization of std::map / non-default constructors

When serializing a std::map (specifically, the loading part) if either the key or value type of the map's pair is not default constructable then workarounds are required (note: this has only been confirmed with the std::map implementation provided with MSVC71). E.g.: {{{ #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/serialization/serialization.hpp> #include <boost/serialization/map.hpp> #include <sstream> #include <utility> //////// // Example, non-default constructable class class X { public: X(int i) : i_(i) {} private: int i_; friend class boost::serialization::access; template <typename A> void serialize(A &ar, const unsigned) {} }; template <typename A> inline void load_construct_data(A &ar, X * a, const unsigned) { ::new(a)X(1); // e.g. } ////////////////////////////////////////// void test_ser_pair() { std::map<double, X> theMap; theMap.insert(std::make_pair(0.5, X(1))); std::string text; { std::ostringstream ostr; boost::archive::text_oarchive arch(ostr); arch & theMap; text = ostr.str(); } { std::istringstream istr(text); boost::archive::text_iarchive arch(istr); // Next line doesn't compile under MSVC7.1 because the serialization // of map uses the default constructor of std::pair. arch & theMap; } } }}} My current workaround is to provide a specialization of just the std::pair constructor for my map's pair, but it would be nice if the library could provide a workaround.
participants (1)
-
Chard