模板函数意外的结果

  • 本文关键字:结果 意外 函数 c++
  • 更新时间 :
  • 英文 :


这段代码没有给我预期的结果!这是怎么回事?

template<typename T, std::enable_if_t < std::is_arithmetic_v<T>,bool> =true>
auto avr(T t)
{
return t;
}
template<typename T,class ... C, std::enable_if_t<(std::is_arithmetic_v<T> &&...&& std::is_arithmetic_v<C>), bool> =true>
auto avr(T t,C...c)
{
return (t + avr(c...)) / (sizeof...(c)+1);
}
int main()
{
std::cout<<avr(1,5,3,7);
return 0;
}

有人可以解释如何解决这个问题吗?

因为每次除以sizeof,而不仅仅是第一个,你应该做这样的事情:

template<class ... C, std::enable_if_t<(...&& std::is_arithmetic_v<C>), bool> =true>
auto sum(C...c)
{
return (c + ...);
}
template<typename T,class ... C, std::enable_if_t<(std::is_arithmetic_v<T> &&...&& std::is_arithmetic_v<C>), bool> =true>
auto avr(T t,C...c)
{
return (t + sum(c...)) / (sizeof...(c)+1);
}

所以首先对数字求和,然后除法(只有一次(

我假设你想使用增量平均计算。

在这种情况下,有两个问题:

首先:每次更新都需要乘以sizeof...(c)

auto
avr(T t, C... c)
{
return (t + sizeof...(c)*avr(c...)) / (sizeof...(c) + 1);
}

第二:你必须使用avr(1., 5., 3., 7.)否则,使用avr(1, 5, 3, 7),你使用整数算术(T,C...=int(并得到错误的结果

int
main()
{
std::cout << avr(1., 5., 3., 7.);
return 0;
}

通过这两个修改,您可以获得预期的结果:4


更新:如果您想使用经典公式:平均值 = 总和/n,请参阅其他答案。但是,您仍然必须对最后一个除法使用实数算术。

最新更新