std::string, std::wstring 以外の std::basic_string の specialization に対する serialization

昨日の話. std::string, std::wstring 以外の std::basic_string の specialization を serialize しようとするとコンパイルに失敗しますよよよ?な話.

typedef std::basic_string< unsigned short > String; // String に対して serialize ができない

このままだと を include しても String に対する serialization ができない (std::basic_string に serialize メンバが無い旨のコンパイルエラーが出る).で, を読んだところ,このヘッダは std::string と std::wstring にしか対応していない.なので, std::string, std::wstring 以外の specialization を 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 に一度乗せる必要とか明らかにないし.