Boost::Serialization Mpi Отправка массива пользовательских типов

Я хочу отправить свой класс Array, используя boost Mpi

template<class T>
class Array
{
 private:
  int size;
  T* data;
 public:
  // constructors + other stuff
};

Здесь T может быть любым встроенным или определенным пользователем типом. Предположим, у меня есть классовый комплекс

struct complex
{
 std::vector<double> real_imag; // contain two elements
};

Итак, вопрос в том, как я могу отправить Array<complex> с помощью сериализации Boost::Mpi +.

Спасибо в ожидании С уважением Номан


person Noman Javed    schedule 03.06.2010    source источник
comment
Какая связь между class Array и struct complex?   -  person Marcelo Cantos    schedule 03.06.2010
comment
Как я уже упоминал, я хочу отправить массив‹complex›. Таким образом, связь заключается в том, что комплекс классов является шаблонным параметром класса Array‹T›.   -  person Noman Javed    schedule 03.06.2010


Ответы (1)


Почему бы вам не использовать вектор STL вместо собственного класса Array. Сериализация STL-векторов уже встроена в boost/serialization/vector.hpp. Если вы хотите отправить массив комплексных чисел, вы можете сделать что-то вроде этого:

#include <vector>
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <boost/serialization/complex.hpp>
#include <boost/serialization/vector.hpp>

using namespace std;
namespace mpi=boost::mpi;

int main (int argc, char *argv[])
{
    mpi::environment env(argc, argv);
    mpi::communicator world;
    int myid=world.rank();
    int NN=world.size();
    int N=10;

    vector< complex<double> >A(N);

    if (myid==0)
    {
            for (int i=0; i!=N; i++)
            {
                    A[i]=complex<double>(i, i);
            }
            world.send(1, 0, A);
    }
    if (myid==1)
    {
            world.recv(0, 0, A);

            cout << "###" << endl;
            for (int i=0; i!=N; i++)
            {
                    cout << A[i] << "\t" ;
            }
            cout << endl;
            cout << "###" << endl;
    }
}

Если нет, вы должны сделать тип данных, который является содержимым вашего вектора, сериализуемым. Если сериализация этого типа данных не является частью библиотеки ускоренной сериализации, вы должны написать свою собственную сериализацию. Например, для вашей сложной структуры сверху что-то вроде этого должно помочь (не проверено):

namespace boost
{
    namespace serialization
    {
            template<class Archive>
            void serialize(Archive & ar, complex & c, const unsigned int version)
            {
                    ar & c.real_imag;
            }
    }
}

Но, как я уже сказал, сложный тип STL уже встроен в ускоренную сериализацию.

person tstollenw    schedule 07.12.2011