模板函数意外的结果
result from a template function unexpected
这段代码没有给我预期的结果!这是怎么回事?
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,请参阅其他答案。但是,您仍然必须对最后一个除法使用实数算术。
相关文章:
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 使用++运算符会导致意外的结果
- 尝试将字符串/字符转换为整数会产生意外结果
- lower_bound() 给出意外的结果
- 三元运算符在返回语句中给出意外的结果
- RapidXML - 代码创建意外结果
- 类中静态函数C++意外结果
- 模板函数意外的结果
- 指针数组中的意外结果
- 使用指针访问数组元素时出现意外结果
- 使用 sprintf 和 %g 将双精度转换为字符串的意外结果
- C++:比较运算符>和字符串文本的意外结果
- 具有意外结果的 C++ 闭包
- 操作员!! 产生意外的结果
- yaml-cpp 比较的意外结果
- Spirit X3:自定义数字解析器在结果中产生意外的前导零
- 每次都出现意外结果
- 在 Qt 中解析嵌套的 JSON 时出现意外结果(数组不存在)
- 如何避免 std::abs 的意外结果?
- 声明双重给它一个值0,但打印结果意外变化