C++:我可以在模板中使用智能指针吗?
C++: Can I use smart pointers with templates?
我有一个抽象基础 class distributions
和两个派生的 classes,continuous_distribution
和 discrete_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);
我有一个抽象基础 class distributions
和两个派生的 classes,continuous_distribution
和 discrete_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);