あなたは一般的なオブジェクトT
をシリアル化するために、「型形質」イディオムを使用することができます。これにより、実装を変更せずに新しいタイプのサポートを追加できるという利点があります。
私が数年前に書きましたこのMPIラッパーを見てください:https://github.com/motonacciu/mpp。
template <class T>
struct mpi_type_traits {
typedef T element_type;
typedef T* element_addr_type;
static inline MPI_Datatype get_type(T&& raw);
static inline size_t get_size(T& raw);
static inline element_addr_type get_addr(T& raw);
};
とコンクリートの型、例えばのための専門を提供:
は、次のようなタイプの特性を定義したいですstd::vector<T>
次のように:
template <class T>
struct mpi_type_traits<std::vector<T>> {
typedef T element_type;
typedef T* element_addr_type;
static inline size_t get_size(std::vector<T>& vec) {
return vec.size();
}
static inline MPI_Datatype get_type(std::vector<T>&& vec) {
return mpi_type_traits<T>::get_type(T{});
}
static inline element_addr_type get_addr(std::vector<T>& vec) {
return mpi_type_traits<T>::get_addr(vec.front());
}
};
をあなたがする必要がある最後の事は、例えば、あなたのMPIのメソッドを実装し、タイプの特性を使用することですMPI_Send
を呼び出すとき:
template <class T>
void send(T &&value, ...) {
MPI_Send(mpi_type_traits<T>::get_addr(value),
mpi_type_traits<T>::get_size(value),
mpi_type_traits<T>::get_type(value), ...);
}
boost :: mpiを見てください。これは基本的にMPI用のC++ラッパーであり、まさにそのことです。 – OutOfBound