C++模板递归停止条件

Rus*_*lan 3 c++ recursion templates

假设我有代码:

template<size_t num> void actLoop(float* result, const float* rvector,
                                          size_t* xs, size_t indexIn=0)
{
    for(xs[num]=0; xs[num]<N; ++xs[num])
    {
        size_t index = indexIn+xs[num]*strides[num];
        if(num>0)
            actLoop<num-1>(result,rvector,xs,index);
        else
            result[index] = work(rvector,index,xs);
    }
}
Run Code Online (Sandbox Code Playgroud)

它应该创建嵌套循环,嵌套级别为num.当我尝试编译它时,我得到编译器错误太深的递归,即似乎编译器不消除if(0> 0)语句.

是否有一种很好的方法可以实现这一目标,而不必为其创建单独的专业化num=0

the*_*amb 5

if( num > 0 )是一个运行时条件.递归发生在编译时.所以不,没有办法避免专业化num = 0.

为什么创建专业化是一个问题num = 0


dyp*_*dyp 5

有一种方法,Andrei Alexandrescu 在Going Native 2013 的一次演讲中提出了它:

template<size_t num> void actLoop(float* result, const float* rvector,
                                          size_t* xs, size_t indexIn=0)
{
    for(xs[num]=0; xs[num]<N; ++xs[num])
    {
        size_t index = indexIn+xs[num]*strides[num];
        if(num>0)
            actLoop<(num > 0 ? num-1 : num)>(result,rvector,xs,index);
        else
            result[index] = work(rvector,index,xs);
    }
}
Run Code Online (Sandbox Code Playgroud)

这指的是actLoopif numis的相同实例化0,因此打破了无限实例化。