この質問は非常に簡単かもしれませんが、私は c++ の経験がなく、単純なパーサーを作成しているときに行き詰まりました。何らかの理由で、文字列比較関数の 1 つが呼び出されたときに期待値を返さないことがありました。関数は次のようになります。
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, "<!--");
固定長の文字バッファーを比較するより効率的な方法があることは知っていますが (後でそれを使用しました)、この関数を実行するとかなり戸惑い、2 つの同一の文字列であっても常に false を返します。
デバッガーで確認し、ループの最後で i の値を確認したところ、テンプレート パラメーターの値と同じでしたが、return 式は 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);
};