[英]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.