昨日の話. 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 に一度乗せる必要とか明らかにないし.