繁体   English   中英

如何为自定义字符串类型编写构造函数/赋值运算符重载?

[英]How to write constructor/assignment operator overloads for custom string types?

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并在每个字符上调用lower之外,没有其他可能性吗?

要从std::string构造ci_string ,可以使用带有迭代器范围的构造函数。 这将遍历std::string并将其字符的副本存储到ci_string

std::string foo = "test";
ci_string bar(foo.begin(), foo.end());

只要基础类型(在这种情况下为char )相同,这将适用于任何basic_string专业化。 但是,您不希望使用std::wstring来执行此操作,因为它使用wchar_t ,这将给您带来不正确的转换。

另外,正如注释中所指出的,您还可以使用采用const char*并计数的构造函数构造ci_string

std::string foo = "test";
ci_string bar(foo.c_str(), foo.length());

这样做的好处是,您不能使用任何在std::wstring使用char以外的char “字符串”,例如std::wstring

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM