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

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

本文关键字:特化 函数模板 c++      更新时间:2023-10-16

我试图做一个总模板专门化,如果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 {}
};

,但在运行时进行检查似乎更简单/更清晰:

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);
}