C ++整数模板参数评估

时间:2013-01-18 20:43:57

标签: c++ templates string-comparison case-insensitive

这个问题可能非常简单,但我对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);
};

1 个答案:

答案 0 :(得分:0)

为了进行不区分大小写的字符串比较,我会尝试使用带有签名的标题<cstring>中的STL函数std::strcoll

int strcoll( const char* lhs, const char* rhs );

并根据当前语言环境比较两个以null结尾的字节字符串。或者,如果您想自己推广,仍然可以使用标题为<cctype>的{​​{3}}

int tolower( int ch );

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