struct ci_char_traits : public std::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 );
static const char* find( const char* s, int n, char a );
};
using ci_string = std::basic_string<char, ci_char_traits>;
我正在使用这个char_traits派生词,它可以帮助我处理不区分大小写的字符串比较。当从字符文字构造ci_strings时,它工作得很好,但是我经常遇到我有一个或两个std :: strings的情况,并且想要不区分大小写地比较它们。 是否有一些方法可以编写自定义构造函数或赋值/转换运算符以从std :: string转换为ci_string,或者除了迭代std :: strings并在每个字符上调用tolower之外没有其他可能性吗?
答案 0 :(得分:2)
要从ci_string
构造std::string
,可以使用带有迭代器范围的构造函数。这将遍历std::string
并将其字符副本存储到ci_string
:
std::string foo = "test";
ci_string bar(foo.begin(), foo.end());
只要基础类型(在这种情况下为basic_string
)相同,这将适用于任何char
专门化。您不希望使用std::wstring
执行此操作,因为它使用wchar_t
,这会导致转换错误。
另外,正如评论中所指出的,您还可以使用构造函数构造ci_string
,该构造函数采用const char*
并计算:
std::string foo = "test";
ci_string bar(foo.c_str(), foo.length());
这样做的好处是你不能使用任何&#34;字符串&#34;使用char
之外的其他内容,例如std::wstring
。