Profitez de la norme char_traits
. Rappelons qu'un std::string
est en fait un typedef pour std::basic_string<char>
, ou plus explicitement, std::basic_string<char, std::char_traits<char> >
. L' char_traits
type décrit la façon dont les caractères comparer, comment ils ont copier, comment ils jetèrent etc. Tout ce que vous devez faire est de typedef une nouvelle chaîne sur basic_string
,, et de les fournir avec votre propre char_traits
qui comparent les cas insensiblement.
struct ci_char_traits : public char_traits<char> {
static bool eq(char c1, char c2) { return toupper(c1) == toupper(c2); }
static bool ne(char c1, char c2) { return toupper(c1) != toupper(c2); }
static bool lt(char c1, char c2) { return toupper(c1) < toupper(c2); }
static int compare(const char* s1, const char* s2, size_t n) {
while( n-- != 0 ) {
if( toupper(*s1) < toupper(*s2) ) return -1;
if( toupper(*s1) > toupper(*s2) ) return 1;
++s1; ++s2;
}
return 0;
}
static const char* find(const char* s, int n, char a) {
while( n-- > 0 && toupper(*s) != toupper(a) ) {
++s;
}
return s;
}
};
typedef std::basic_string<char, ci_char_traits> ci_string;
Les détails sont sur le Gourou de La Semaine, au nombre de 29.