【发布时间】:2017-08-07 14:44:15
【问题描述】:
我有一个模板函数,只要模板类型是数字,它就会对给定的值做一些事情:
template <typename scalar_t>
void function(scalar_t value)
{
if constexpr (std::is_floating_point_v<scalar_t>)
{
std::cout << value << 'F';
}
if constexpr (std::is_integral_v<scalar_t>)
{
std::cout << value;
}
}
这个模板的重载需要一个包含数字的容器:
template <typename scalar_t, template <typename> class container_t>
void function(const container_t<scalar_t> &container)
{
for (const auto &value : container)
{
function(value);
std::cout << ' ';
}
}
使用上面的模板,我调用以下代码:
int main()
{
function('0');
function(short{1});
function(2);
function(3l);
function(4ll);
function(5.f);
function(6.);
std::vector<int> v{7, 8, 9, 10};
std::list<double> l{11., 12., 13., 14.};
function(v);
function(l);
return 0;
}
它给出以下输出:
012345F6F
虽然我期待以下输出:
012345F6F7 8 9 10 11F 12F 13F 14F
这意味着选择了第一个模板版本 (function(scalar_t value)) 而不是第二个版本 (function(const container_t<scalar_t> &container))。
如何强制为模板模板参数选择模板函数的第二个版本?
【问题讨论】:
-
不确定是否是问题所在,但
vector和list没有一个,而是两个模板参数 -
@tobi303 that was the problem indeed 如果你能在答案中解释为什么我可以投票:)
标签: c++ templates overloading