Std :: বেসিক_স্ট্রিংয়ের সাথে ব্যবহারের জন্য Char_traits এর কেস-সংবেদনশীল সংস্করণ লিখেছিলাম একটি std :: স্ট্রিং তৈরি করার জন্য যা বিল্ট-ইন std :: বেসিক_স্ট্রিং সদস্য ফাংশনগুলি ব্যবহার করে তুলনা, অনুসন্ধান ইত্যাদির ক্ষেত্রে ক্ষেত্রে সংবেদনশীল নয়।
সুতরাং অন্য কথায়, আমি এই জাতীয় কিছু করতে চেয়েছিলাম।
std::string a = "Hello, World!";
std::string b = "hello, world!";
assert( a == b );
... যা স্ট্যান্ড :: স্ট্রিং হ্যান্ডেল করতে পারে না। এখানে আমার নতুন চর_ট্রাটের ব্যবহার রয়েছে:
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
। অন্যথায়, হার্বের কী বলতে হবে তা পড়ুন ।