C++ 函数模板按值特化 (-1)

C++ Function Template specialisation by value ( -1 )

我正在尝试做一个完整的模板专业化,如果 i > -1 否则什么都不做(终止条件),它应该执行第一个代码块 (suffixTry)。我不太确定最后的 suffixTry 模板应该如何编写。编译时,编译器指向范围内的-1 is unknown

template< typename S ,typename I >
void suffixTry(S pattern, I suff[], I size, I f, I g, I i) {
    suff[size - 1] = size;

    if (i > g && suff[i + size - 1 - f]  < i - g){
        suff[i] = suff[i + size - 1 - f];
    } else {
        if (i < g)
            g = i;

        f = i;
        reduceToZero(pattern, g, size, f);
        suff[i] = f - g;
    }

    suffixTry(pattern, suff, size, f, g, --i);
}

template< typename S ,typename I>
void  suffixTry(S pattern, I suff[], I size, I f, I g, -1) {

}

从你的代码来看,你似乎只需要简单的递归:

template< typename S ,typename I >
void  suffixTry(S pattern, I suff[], I size, I f, I g, I i   ) {
    // base case:
    if (i == -1) {
        return;
    }

    suff[size-1]=size;

    if( i > g && suff[i + size - 1 - f]  < i -g ){
        suff[i] = suff[i+size-1-f];
    }
    else{
        if ( i < g)
            g = i;

        f=i;
        reduceToZero(pattern , g,size,f);
        suff[i] = f - g ;

     }
     suffixes(pattern,suff, size, f , g ,  --i);

}

您不能对普通参数进行特化,只能对模板参数进行特化。

因此需要:

template<typename S, typename I, I i>
void suffixTry(S pattern, I suff[], I size, I f, I g);

但是你不能在功能上进行部分专业化,所以你必须引入一个struct。 此外 i 不能依赖 I 进行部分专业化,所以我使用 int 代替。

template<typename S, typename I, int i>
struct suffixTry
{
    void operator () (S pattern, I suff[], I size, I f, I g) const
    {
        suff[size - 1]=size;

        if (i > g && suff[i + size - 1 - f]  < i - g) {
            suff[i] = suff[i + size - 1 - f];
        } else {
            if (i < g)
                g = i;
            f = i;
            reduceToZero(pattern, g, size, f);
            suff[i] = f - g ;
        }
        suffixTry<S, I, i - 1>()(pattern, suff, size, f , g);

    }
};

template<typename S, typename I>
struct suffixTry<S, I, -1>
{
    void operator () (S pattern, I suff[], I size, I f, I g) const {}
};

但似乎simpler/clearer在运行时进行检查:

template <typename S, typename I>
void suffixTry(S pattern, I suff[], I size, I f, I g, I i) {
    if (i == -1) {
        return;
    }
    suff[size - 1] = size;

    if (i > g && suff[i + size - 1 - f]  < i - g){
        suff[i] = suff[i + size - 1 - f];
    } else {
        if (i < g)
            g = i;

        f = i;
        reduceToZero(pattern, g, size, f);
        suff[i] = f - g;
    }

    suffixTry(pattern, suff, size, f, g, --i);
}