昨日の話. std::string, std::wstring 以外の std::basic_string の specialization を serialize しようとするとコンパイルに失敗しますよよよ?な話.
typedef std::basic_string< unsigned short > String; // String に対して serialize ができない
このままだと
#include <string> #include <vector> #include <boost/serialization/vector.hpp> #include <boost/serialization/split_free.hpp> #include <boost/serialization/level.hpp> typedef std::basic_string< unsigned short > String; namespace boost{ namespace serialization{ template< class Archive > void save( Archive &ar, String const &str, unsigned /*version*/ ) { std::vector< unsigned char > tmp( str.begin(), str.end() ); ar << static_cast< String const & >( tmp ); } template< class Archive > void load( Archive &ar, String &str, unsigned /*version*/ ) { std::vector< unsigned short > tmp; ar >> tmp; str.assign( tmp.begin(), tmp.end() ); } template< class Archive > void serialize( Archive &ar, String &str, unsigned version ) { boost::serialization::split_free( ar, str, version ); } }} // namespace boost::serialization BOOST_CLASS_IMPLEMENTATION( String, boost::serialization::object_serializable );
でも本当はちゃんと追わないといけないんだけれど. std::vector に一度乗せる必要とか明らかにないし.