Cereal ライブラリを使用してアルマジロ マトリックスのシリアル化を実装しようとしています。SOにはサンプルがありますhere。残念ながらBoostは使えません。これまでのところ、私はこれを手に入れました。mat_extra_meat.hpp の内部
template<class Archive, class eT>
typename std::enable_if<cereal::traits::is_output_serializable<cereal::BinaryData<eT>, Archive>::value, void>::type
save( Archive & ar, const Mat<eT>& m ) {
uword n_rows_local, n_cols_local, n_elem_local, vec_state_local;
std::size_t data_size;
n_rows_local = m.n_rows;
n_cols_local = m.n_cols;
n_elem_local = m.n_elem;
vec_state_local = m.vec_state;
ar( n_rows_local, n_cols_local, n_elem_local, vec_state_local );
data_size = static_cast< std::size_t >( m.n_elem * sizeof( eT ) );
ar( cereal::binary_data( reinterpret_cast< void * const >( const_cast< eT* >( m.memptr() ) ), data_size ) );
};
template<class Archive, class eT>
typename std::enable_if<cereal::traits::is_input_serializable<cereal::BinaryData<eT>, Archive>::value, void>::type
load( Archive & ar, Mat<eT>& m ) {
uword n_rows_local, n_cols_local, n_elem_local, vec_state_local;
std::size_t data_size;
ar( n_rows_local, n_cols_local, n_elem_local, vec_state_local );
data_size = static_cast< std::size_t >( n_elem_local * sizeof( eT ) );
m.set_size( n_rows_local, n_cols_local );
ar( cereal::binary_data( reinterpret_cast< void * const >( const_cast< eT* >( m.memptr() ) ), data_size ) );
};
void TestArmadilloSerialization() {
arma::mat xx1 = arma::randn( 10, 20 );
std::ofstream ofs( "test", std::ios::binary );
cereal::BinaryOutputArchive o( ofs );
o( xx1 );
ofs.close();
// Now load it.
arma::mat xx2;
std::ifstream ifs( "test", std::ios::binary );
cereal::BinaryInputArchive i( ifs );
i( xx2 );
}