c++整型模板参数求值
C++ integer template parameter evaluation
这个问题可能非常直接,但我对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语言环境定义的字符转换规则将给定的字符转换为小写。
相关文章:
- C 字符串返回字符串的整数/双精度/长整型值
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 可变参数泛型 lambda 和函数重载
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么C++不允许两个同名的函数/类模板,区别仅在于非类型模板参数(整型)的类型?
- 为什么当我使用长整整型和整型作为参数时,最大函数会出现错误
- 模板参数可以既是 int 又可以是无符号长整型吗?
- 将C++整型模板参数转换为整型"longer"型
- 整型非类型参数和非整型非类型参数的模板部分特化,g++和clang的区别
- 整型常量表达式中不允许使用模板参数
- 无法将参数 1 从"cli::array<Type> ^"转换为"无符号短整型"
- C++非类型模板参数:是整型的typedef还是整型
- 整型的C++参数
- 警告:指针和整型之间的比较,传递' read '的参数1使指针的整型没有强制转换
- 类型、整型常量和模板模板参数的可变模板
- 基于运行时参数执行整型模板函数
- 为零填充宽度和精度与要打印的整型参数相同
- c++整型模板参数求值