Boost MPI provides a convenient wrapper to send/receive c++ objects.
#include "stdafx.h"
#include <boost/mpi.hpp>
#include <iostream>
#include <vector>
#include <string>
namespace mpi = boost::mpi;
using namespace std;
class cPerson{
public:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & name;
ar & address;
ar & age;
ar & height;
ar & weight;
ar & gender;
}
cPerson(){;};
cPerson(string &namet,string &addresst,int aget,double heightt,double weightt,char gendert) : name(namet),address(addresst),age(aget),height(heightt),weight(weightt),gender(gendert){};
string get_name()const {return name;}
string get_address()const {return address;}
int get_age() const {return age;}
private:
string name,address;
int age;
double height,weight;
char gender;
};
int main(int argc, char *argv[]) {
mpi::environment env(argc, argv);
mpi::communicator world;
if(world.rank() == 0) {
std::vector<cPerson> person;
string name1="Xiao Ming";
string add1="Beijing china";
char gen1 = 'M';
person.push_back(cPerson(name1,add1,20,1.90,180,gen1));
string name2="Xiao Qiang";
string add2="Shanghai china";
char gen2 = 'M';
person.push_back(cPerson(name2,add2,20,1.90,180,gen2));
for(int i=1;i<world.size();i++){world.send(i, 100, person);};
}
else {
std::vector<cPerson> person;
world.recv(0, 100, person);
std::cout << "Rank= "<<world.rank()<<" Received information:" << std::endl;
for(int i=0;i<person.size(); i++) {
std::cout<<"Name: "<<person[i].get_name()<<std::endl;
std::cout<<"Addr: "<<person[i].get_address()<<std::endl;
std::cout<<"Name: "<<person[i].get_age()<<std::endl;
std::cout<<" "<<std::endl;
}
}
return 0;
}