簡體   English   中英

按值(-1)的C ++函數模板專業化

[英]C++ Function Template specialisation by value ( -1 )

我正在嘗試做一個總模板專用化,如果i > -1 ,則應該執行第一段代碼( suffixTry ),否則什么都不做(終止條件)。 不確定最后一個suffixTry模板應如何編寫。 編譯時,編譯器指出-1 is unknown在范圍內-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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM