C++:我可以在模板中使用智能指针吗?

C++: Can I use smart pointers with templates?

我有一个抽象基础 class distributions 和两个派生的 classes,continuous_distributiondiscrete_distribution。我有一个函数 make_distribution 和一个 unordered_map returns 一个指向(连续)分布的智能指针,

std::shared_ptr<continuous_distribution> make_distribution(std::tuple<std::string, float, float> DIST) 
{
    std::string name = std::get<0>(DIST);
    float a = std::get<1>(DIST);
    float b = std::get<2>(DIST);
    
    std::unordered_map<std::string,std::shared_ptr<continuous_distribution>> MAP = {
        std::make_pair("cauchy", std::make_shared<cauchy>(a, b)),
        std::make_pair("exponential", std::make_shared<exponential>(a)),
        {...}
    };

    return MAP[name];
}

因为有两个派生的 classes,我想知道是否有一种方法可以利用模板编写单个函数,returns 指向相应分布类型的指针.我尝试使用以下内容,

template <class type>
std::shared_ptr<type> make_distribution(std::tuple<std::string, float, float> DIST) 
{
    std::string name = std::get<0>(DIST);
    float a = std::get<1>(DIST);
    float b = std::get<2>(DIST);

    std::unordered_map<std::string,std::shared_ptr<type>> MAP = {
        std::make_pair("cauchy", std::make_shared<cauchy>(a, b)),
        std::make_pair("exponential", std::make_shared<exponential>(a)),
        {...}
    };

    return MAP[name];
}

但是,调用这个函数时,

int main()
{
    std::tuple<std::string, float, float> TARGET{"cauchy", 1, 1};
    std::shared_ptr<continuous_distribution> target = make_distribution(TARGET);
}

我收到一个我不太明白的错误,

no instance of function template "make_distribution" matches the argument list -- argument types are: (std::tuple<std::string, float, float>)

模板参数只能从调用函数参数中推导出来,它们不能从 return 类型中推导出来。并且 none 函数中的参数取决于模板参数,因此不匹配。

在您的情况下,您必须明确指定模板参数,它应该可以工作:

std::shared_ptr<continuous_distribution> target = make_distribution<continuous_distribution>(TARGET);