0

Boost Serialization ライブラリが提供する形式とは異なる形式で STL コレクションが XML アーカイブに保存されるように、Boost Serialization ライブラリを拡張したいと考えています。

私が正しければ、シリアル化中にすべての STL コンテナーが次の関数を渡します。

// <boost/serialization/collections_save_imp.hpp>

namespace boost{ namespace serialization { namespace stl {

template<class Archive, class Container>
inline void save_collection(Archive & ar, const Container &s)
{
    /* ... */
}

} } }

だから私は、この関数をオーバーロードしようとしましたxml_oarchive。これが私のアプローチの小さな例です:

#include <iostream>
#include <vector>

#include <boost/archive/xml_oarchive.hpp>
#include <boost/serialization/vector.hpp>

namespace boost { namespace serialization { namespace stl {

template< typename Container >
inline void save_collection( boost::archive::xml_oarchive& ar, Container const& s )
{
  /* My serialization */
}

} } }

int main()
{
  {
    boost::archive::xml_oarchive ar( std::cout );

    std::vector< int > x;

    x.push_back( -1 );
    x.push_back(  1 );
    x.push_back( 42 );
    x.push_back(  0 );

    ar << BOOST_SERIALIZATION_NVP( x );
  }

  return 0;
}

コンパイルして実行します。しかし、それは私の関数を呼び出すのではなく、Boost によって提供される関数を呼び出します。STL コンテナーのシリアル化を機能させるには、何を行う必要がありますか?

4

1 に答える 1

0

最後に、私は私の問題に対するこの解決策を思いつきました:

#include <iostream>
#include <vector>

namespace boost { namespace archive { class xml_oarchive; } }

namespace boost { namespace serialization { namespace stl { 


  /* Two template parameters are needed here because at the caller side
   * a function with two template parameters is explicitly requested. */
  template< typename, typename Container >
  void save_collection( boost::archive::xml_oarchive&, Container const& )
  {
      /* ... */
  }

} } }
/* Note that this is before the boost includes. */

#include <boost/archive/xml_oarchive.hpp>
#include <boost/serialization/vector.hpp>


int main()
{
  {
    boost::archive::xml_oarchive ar( std::cout );

    std::vector< int > x;

    x.push_back( -1 );
    x.push_back(  1 );
    x.push_back( 42 );
    x.push_back(  0 );

    ar << BOOST_SERIALIZATION_NVP( x );
  }

  return 0;
}
于 2013-05-31T21:12:13.910 に答える