我正在尝试使用模板变量创建通讯类。 我的同事要求我使用 std::unique_ptr 进行内存管理。 但我认为我未能实现多态性。
我编写的代码如下。
template<typename env>
class Comm{
public:
Comm(size_t rank, size_t world_size): rank(rank), world_size(world_size) {};
Comm(){};
~Comm(){};
int rank;
int world_size;
}
template<typename env>
std::unique_ptr<Comm<env> > createComm(int argc, char *argv[]){
std::cout << "empty comm" << std::endl;
return std::make_unique< Comm<env> >();
};
template<>
std::unique_ptr<Comm<MKL> > createComm(int argc, char *argv[]){
std::cout << "SERIALcomm" << std::endl;
return std::make_unique< Comm<MKL> >( 0, 1 );
}
template<>
std::unique_ptr<Comm<MPI> > createComm(int argc, char *argv[]){
std::cout << "MPIcomm" << std::endl;
MPI_Init(&argc, &argv);
int myRank ,nRanks;
MPI_Comm_rank(mpi_comm, &myRank);
MPI_Comm_size(mpi_comm, &nRanks);
assert(nRanks>0);
assert(myRank>=0);
return std::make_unique< Comm<MPI> >( (size_t) myRank, (size_t) nRanks );
}
这是一个测试代码
int main(int argc, char* argv[]){
auto comm = createComm<MKL>(argc, argv);
return 0;
}
我有 “空通讯” 作为输出。
如何使用createComm方法制作MKL类型或MPI通信对象?
您的语法错误:
template<>
std::unique_ptr<Comm<MKL> > createComm(int argc, char *argv[]){
std::cout << "SERIALcomm" << std::endl;
return std::make_unique< Comm<MKL> >( 0, 1 );
}
应该是
template<>
std::unique_ptr<Comm<MKL> > createComm<MKL>(int argc, char *argv[]){
std::cout << "SERIALcomm" << std::endl;
return std::make_unique< Comm<MKL> >( 0, 1 );
}
这是一个完整且最小的示例:
#include <iostream>
template<class T>
void f()
{ std::cout << "f<T>()\n"; }
template<>
void f<int>()
{ std::cout << "f<int>()\n"; }
int main()
{
f<int>(); // prints f<int>()
}