Sie können "Typ Traits" Idiom verwenden T
ein generisches Objekt serialisiert werden. Dies bietet Ihnen den Vorteil, dass Sie Unterstützung für neue Typen hinzufügen können, ohne die Implementierung zu ändern.
Werfen Sie einen Blick auf diese MPI-Wrapper, die ich vor Jahren schrieb: https://github.com/motonacciu/mpp.
Sie wollen eine Art Eigenschaft wie folgt definiert werden: für Betone
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);
};
und bieten Spezialisierung, zum Beispiel ein std::vector<T>
wie folgt:
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());
}
};
Das letzte, was Sie tun müssen, ist Ihre MPI-Methode zu implementieren und die Art Merkmale verwenden, z.B. wenn ein MPI_Send
Aufruf:
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), ...);
}
Werfen Sie einen Blick auf boost :: mpi. Es ist im Grunde ein C++ Wrapper für MPI und macht genau das. – OutOfBound