c++整型模板参数求值

C++ integer template parameter evaluation

本文关键字:参数 整型 c++      更新时间:2023-10-16

这个问题可能非常直接,但我对c++相当缺乏经验,在编写一个简单的解析器时被卡住了。由于某种原因,其中一个字符串比较函数在调用时没有返回预期的值。函数看起来像这样:

template<int length>
bool Parser::compare(const char *begin, const char *str){
   int i = 0;
   while(i != length && compareCaseInsensitive(*begin, *str)){
      i++;
      begin++;
      str++;
   }
   return i == length;
 };

这个函数的目的是比较运行时字符缓冲区和编译时常量字符串vb

compare<4>(currentByte, "<!--");

我知道有更有效的方法来比较固定长度的字符缓冲区(后来使用了一个),但我很困惑,当我运行这个函数,它总是返回false,即使有两个相同的字符串。

我检查了调试器,并在循环结束时检查了I的值,它等于模板参数的值,但仍然返回表达式的值为false。使用int型模板形参有什么特殊的规则吗?我假定模板形参的行为类似于编译时常数。

我不知道这是否相关,但我正在运行gcc的g++编译器并使用gdb进行调试。

如果有人能告诉我是什么原因导致这个问题,我将不胜感激。

这段代码中使用的函数:

template<typename Character>
Character toLowerCase(Character c){
    return c > 64 && c < 91 ? c | 0x10 : c;
};
template<typename Character>
bool equalsCaseInsensitive(Character a, Character b){
    return toLowerCase(a) == toLowerCase(b);
};

对于不区分大小写的字符串比较,我会尝试使用STL函数std::strcoll从具有签名

的标头<cstring>中使用
int strcoll( const char* lhs, const char* rhs );

并根据当前语言环境比较两个以空结尾的字节字符串。或者如果你想滚动你自己的,你仍然可以使用标头<cctype>的std::tolower,它具有签名

int tolower( int ch );

,并根据当前安装的C语言环境定义的字符转换规则将给定的字符转换为小写。