C++ 来自模板函数的意外结果

C++ 来自模板函数的意外结果,c++,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> &&...&

这个代码没有给我预期的结果!怎么样

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);
}
第二:必须使用avr1,5,3,7。否则,对于avr1,5,3,7,使用整数算术T,C..=int得到错误的结果

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

  return 0;
}
通过这两个修改,您可以得到预期的结果:4


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

您的预期结果是什么?我的预期结果是4请给出[mvce]。什么是算术?如果T和C都是算术的,你每次都要除以sizeof,所以首先你要除以4,然后再除以3,然后再除以2,得到4,实际上你不需要浮点运算,它只是16/4,但是如果这只是一个例子,这是一个很好的点,因此,如果它是15/4,它会返回错误的平均值为什么程序不能在MSVS2019上编译?它是c++17,我用g++或clang++编译它。我没有访问权限MSVS2019@Berto99我同意,问题是我不知道最初的目标是不是使用增量公式。。。无论如何,如果Ope想要一个在所有情况下都能返回正确平均值的过程,他至少在最后一步sum/nyes中需要真正的算术运算,但最好放一个*1。在avr部门内部,以便在这种情况下不依赖于用户输入