C++ 使用模板递归向上求和整数是否可能?

C++ 使用模板递归向上求和整数是否可能?,c++,recursive-templates,C++,Recursive Templates,使用递归模板,我想计算从0到n的第一个n整数的和。也就是说,summap::n将是55。我想知道,因为我习惯于向下递归(即从n到0)。可以从0到n吗?以下是我的尝试: template<int n> struct SumUp { static constexpr int n = n; }; template<> struct SumUp<0> { static constexpr int n = 0 + SumUp<n + 1>:

使用递归模板,我想计算从0到n的第一个
n
整数的和。也就是说,
summap::n
将是55。我想知道,因为我习惯于向下递归(即从
n
到0)。可以从0到n吗?以下是我的尝试:

template<int n> struct SumUp {
    static constexpr int n = n;
};

template<> struct SumUp<0> {
    static constexpr int n = 0 + SumUp<n + 1>::n;  // <- Problem
};
模板结构汇总{
静态constexpr int n=n;
};
模板结构汇总{
静态constexpr int n=0+summup::n;//“向下”递归已向上计数

例如,当你这样做的时候

int sum(int N)
{
    if (N == 0) return 0;
    return sum(N-1) + N
}
实际上,您首先计算总和(0)。
然后求和(1)=求和(0)+1
然后求和(2)=求和(1)+2
然后求和(3)=求和(2)+3

我把它写为一个正则函数,但不管语言是什么,它都是相同的,无论是运行时C++、模板还是Visual Basic。 现在,如果你想逆转这个方向并向下计数,你需要跟踪目标

template<int N, int i = 0> struct SumUp {
    static constexpr int n = i + SumUp<N, i+1>::n;
};

template<int N> struct SumUp<N, N> {
    static constexpr int n = N;
};

static_assert(SumUp<1>::n == 1);
static_assert(SumUp<2>::n == 3);
static_assert(SumUp<3>::n == 6);
static_assert(SumUp<4>::n == 10);
模板结构汇总{
静态constexpr int n=i+summap::n;
};
模板结构汇总{
静态constexpr int n=n;
};
静态断言(summup::n==1);
静态断言(summup::n==3);
静态断言(summup::n==6);
静态断言(summup::n==10);
  • 第一部分将总和定义为[i..n]范围内整数的总和
  • 第二部分定义了当n==i时的停止条件

一个简单的
求和如何工作?您仍然在无条件地调用求和是否可能,是的--但是像任何递归定义一样,您需要知道停止点。如果您想计算,那么您需要知道终点是什么(例如,您需要将
N
与开始条件一起传递,并在
Current==N
时停止)考虑下循环:Sum为0,Sum为N+Sum。为什么不将
std::integer\u序列
与折叠表达式结合使用?不确定您的意思。如果它更清楚,您可以执行
汇总{static constexpr int N=0;}
。一步之后,你将打破递归,得到相同的结果。除了我不确定N,N+1是否会作为特化。也许是一些积分常数魔法。哦,对了,现在已经很晚了,我的大脑到目前为止还不能很好地解析幽默:)至于这一点,我不知道,OP想把它颠倒过来,我想这是一些训练练习或纯粹的好奇心。我认为这是一个简单的解决方案,符合OP的要求。我确实发布了一个基于整数序列的答案,但我现在认为这更简单。