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);
}
我正在尝试做一个完整的模板专业化,如果 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);
}