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 {}
};
,但在运行时进行检查似乎更简单/更清晰:
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);
}
相关文章:
- 何时需要实例化函数模板定义?
- 使用通用函数指针参数化函数模板的简洁方法
- 无法专用化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
- 使用泛型类型显式实例化函数模板
- MSVC 编译器实例化函数模板的默认定义,即使存在专用化
- 错误 C2893:无法使用 CTPL 专用化函数模板
- 模板化函数模板专用化
- C++ 无法专用化函数模板
- 实例化函数模板的编译问题
- 当类型参数为空时,无法实例化函数模板
- 无法专用化函数模板编译器错误
- 如何结合模板部分特化和模板参数推演
- 表达式模板 - 无法专用化函数模板
- 如何部分专用化函数模板
- 无法专用化函数模板。重载运算符<<
- 通过类的模板形参特化成员模板结构
- 带有模板化参数的部分特化函数模板
- 在线程中特化函数模板失败
- c++错误C2893:特化函数模板失败
- 我应该怎么做,而不是部分特化函数模板