unique_ptr 生成成员函数的模板特化

问题描述 投票:0回答:1

我正在尝试使用模板变量创建通讯类。 我的同事要求我使用 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通信对象?

c++ c++11 constructor polymorphism
1个回答
1
投票

您的语法错误:

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>()
}

coliru 演示

© www.soinside.com 2019 - 2024. All rights reserved.