这段代码没有给我预期的结果!这是怎么回事?
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,请参阅其他答案。但是,您仍然必须对最后一个除法使用实数算术。