मैंने std के साथ उपयोग के लिए char_traits का एक केस-असंवेदनशील संस्करण लिखा है :: मूल_स्ट्रीमिंग एक std उत्पन्न करने के लिए :: स्ट्रिंग जो केस-संवेदी नहीं है, जब अंतर्निहित एसटीडी का उपयोग करके तुलना, खोजों आदि का उपयोग किया जा रहा है :: मूल-सदस्य सदस्य फ़ंक्शन।
इसलिए दूसरे शब्दों में, मैं ऐसा कुछ करना चाहता था।
std::string a = "Hello, World!";
std::string b = "hello, world!";
assert( a == b );
... जो std :: string हैंडल नहीं कर सकता। यहाँ मेरे नए char_traits का उपयोग किया गया है:
std::istring a = "Hello, World!";
std::istring b = "hello, world!";
assert( a == b );
... और यहाँ कार्यान्वयन है:
/* ---
Case-Insensitive char_traits for std::string's
Use:
To declare a std::string which preserves case but ignores case in comparisons & search,
use the following syntax:
std::basic_string<char, char_traits_nocase<char> > noCaseString;
A typedef is declared below which simplifies this use for chars:
typedef std::basic_string<char, char_traits_nocase<char> > istring;
--- */
template<class C>
struct char_traits_nocase : public std::char_traits<C>
{
static bool eq( const C& c1, const C& c2 )
{
return ::toupper(c1) == ::toupper(c2);
}
static bool lt( const C& c1, const C& c2 )
{
return ::toupper(c1) < ::toupper(c2);
}
static int compare( const C* s1, const C* s2, size_t N )
{
return _strnicmp(s1, s2, N);
}
static const char* find( const C* s, size_t N, const C& a )
{
for( size_t i=0 ; i<N ; ++i )
{
if( ::toupper(s[i]) == ::toupper(a) )
return s+i ;
}
return 0 ;
}
static bool eq_int_type( const int_type& c1, const int_type& c2 )
{
return ::toupper(c1) == ::toupper(c2) ;
}
};
template<>
struct char_traits_nocase<wchar_t> : public std::char_traits<wchar_t>
{
static bool eq( const wchar_t& c1, const wchar_t& c2 )
{
return ::towupper(c1) == ::towupper(c2);
}
static bool lt( const wchar_t& c1, const wchar_t& c2 )
{
return ::towupper(c1) < ::towupper(c2);
}
static int compare( const wchar_t* s1, const wchar_t* s2, size_t N )
{
return _wcsnicmp(s1, s2, N);
}
static const wchar_t* find( const wchar_t* s, size_t N, const wchar_t& a )
{
for( size_t i=0 ; i<N ; ++i )
{
if( ::towupper(s[i]) == ::towupper(a) )
return s+i ;
}
return 0 ;
}
static bool eq_int_type( const int_type& c1, const int_type& c2 )
{
return ::towupper(c1) == ::towupper(c2) ;
}
};
typedef std::basic_string<char, char_traits_nocase<char> > istring;
typedef std::basic_string<wchar_t, char_traits_nocase<wchar_t> > iwstring;
std::stricmp
। अन्यथा, हर्ब को क्या कहना है , पढ़ें ।