Настоящая суть проблемы здесь в том, что вы хотите добавить функцию-член serialize()
к различным объектам Armadillo, но это не представляется возможным... за исключением того, что благодаря умному использованию препроцессора в Armadillo, это !
Взгляните на Mat_bones.hpp
и Col_bones.hpp
... вы увидите что-то подобное внутри определений классов Mat
и Col
:
public:
#ifdef ARMA_EXTRA_COL_PROTO
#include ARMA_INCFILE_WRAP(ARMA_EXTRA_COL_PROTO)
#endif
Я очень обрадовался, когда нашел это, потому что теперь я могу сделать что-то вроде определения файла с именем Mat_extra_bones.hpp
:
//! Add a serialization operator.
template<typename Archive>
void serialize(Archive& ar, const unsigned int version);
а затем Mat_extra_meat.hpp
:
// Add a serialization operator.
template<typename eT>
template<typename Archive>
void Mat<eT>::serialize(Archive& ar, const unsigned int /* version */)
{
using boost::serialization::make_nvp;
using boost::serialization::make_array;
const uword old_n_elem = n_elem;
// This is accurate from Armadillo 3.6.0 onwards.
// We can't use BOOST_SERIALIZATION_NVP() because of the access::rw() call.
ar & make_nvp("n_rows", access::rw(n_rows));
ar & make_nvp("n_cols", access::rw(n_cols));
ar & make_nvp("n_elem", access::rw(n_elem));
ar & make_nvp("vec_state", access::rw(vec_state));
// mem_state will always be 0 on load, so we don't need to save it.
if (Archive::is_loading::value)
{
// Don't free if local memory is being used.
if (mem_state == 0 && mem != NULL && old_n_elem > arma_config::mat_prealloc)
{
memory::release(access::rw(mem));
}
access::rw(mem_state) = 0;
// We also need to allocate the memory we're using.
init_cold();
}
ar & make_array(access::rwp(mem), n_elem);
}
Затем в вашей программе все, что вам нужно сделать, это
#define ARMA_EXTRA_MAT_PROTO mat_extra_bones.hpp
#define ARMA_EXTRA_MAT_MEAT mat_extra_meat.hpp
а функция serialize()
будет членом класса Mat
. Вы можете легко адаптировать это решение для других типов броненосцев.
На самом деле это именно то, что делает библиотека mlpack (http://www.mlpack.org/), поэтому если вам интересно, вы можете поближе взглянуть на точное решение, которое я там реализовал:
https://github.com/mlpack/mlpack/tree/master/src/mlpack/core/arma_extend
person
ryan
schedule
12.10.2016