Оценка параметров целочисленного шаблона C ++

Этот вопрос может быть очень простым, но я довольно неопытен с 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 в конце цикла, и оно было равно значению параметра шаблона, но все еще возвращаемое выражение оценивается как ложное.
Существуют ли особые правила работы с параметрами шаблона 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);
};

3

Решение

Для сравнения строк без учета регистра я бы попробовал использовать функцию STL станд :: strcoll из шапки <cstring> которая имеет подпись

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

и сравнивает две строки байтов с нулевым символом в конце в соответствии с текущей локалью. Или, если вы хотите бросить свой собственный, вы все равно можете использовать станд :: ToLower из шапки <cctype> которая имеет подпись

int tolower( int ch );

и преобразует данный символ в нижний регистр в соответствии с правилами преобразования символов, определенными в настоящее время установленным языковым стандартом C.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector