我有一个抽象基类distributions
,它有两个派生类continuous_distribution
和discrete_distribution
。我有一个函数make_distribution
和一个unordered_map
,它返回一个指向(连续(分布的智能指针
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];
}
由于有两个派生类,我想知道是否有一种方法可以使用模板来编写一个函数,该函数返回指向相应分发类型的指针。我尝试使用以下
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>)
模板参数只能从调用函数参数中推导出来,而不能从返回类型中推导出来。函数中的任何参数都不依赖于模板参数,因此不匹配。
在您的情况下,您必须指定模板参数EXPLICITLY,它应该可以工作:
std::shared_ptr<continuous_distribution> target = make_distribution<continuous_distribution>(TARGET);