我想使用boost Mpi发送我的Array类
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
};
所以问题是如何使用Boost :: Mpi +序列化发送Array<complex>
。
感谢您的期待 问候 诺曼
答案 0 :(得分:4)
为什么不使用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;
}
}
如果没有,则必须使作为向量内容的数据类型可序列化。如果该数据类型的序列化不是boost序列化库的一部分,则必须编写自己的序列化。例如,对于你上面的复杂结构,像这样的一些想法应该做的伎俩(未经测试):
namespace boost
{
namespace serialization
{
template<class Archive>
void serialize(Archive & ar, complex & c, const unsigned int version)
{
ar & c.real_imag;
}
}
}
但正如我所说,STL复杂类型已经在boost序列化中构建。