如何为自定义字符串类型编写构造函数/赋值运算符重载
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::字符串,并且希望不区分大小写地比较它们。有没有办法编写一个自定义构造函数或赋值/转换运算符来从std::string转换为ci_string,或者除了迭代std::字符串并对每个字符调用tolower之外,没有其他可能性吗?
要从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
,这会给您带来不正确的转换。
此外,正如注释中所指出的,您还可以使用构造函数构造ci_string
,该构造函数接受const char*
和计数:
std::string foo = "test";
ci_string bar(foo.c_str(), foo.length());
这样做的优点是,您不能在后台使用任何使用char
以外的东西的"字符串",如std::wstring
。
相关文章:
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++:关于使用 Stroustrup 示例移动构造函数/赋值的问题
- 初始值设定项列表与构造函数赋值与变量定义
- std::vector::emplace() 真的在面对抛出移动构造函数/赋值运算符时提供了强大的异常保证吗?
- 创建一个类并在C++中使用构造函数(赋值)
- 如何为具有自引用指针的类实现复制构造函数/赋值运算符
- 使typedef的构造函数/赋值运算符成为友元函数
- 复制构造函数+赋值运算符
- C++ 矢量从构造函数赋值对象,无需临时
- 具有std::原子成员变量的类的复制构造函数/赋值运算符出错
- 初始化对象时复制构造函数/赋值运算符混淆
- 默认情况下是默认的构造函数/赋值noexcept/constexpr
- 是否为派生类生成的移动构造函数/赋值运算符
- 复制构造函数/赋值运算符
- C++复制构造函数/赋值运算符错误
- 正在获取要使用的移动构造函数/赋值运算符
- 私有复制构造函数/赋值运算符和复制初始化
- 如何为自定义字符串类型编写构造函数/赋值运算符重载
- 为什么C++允许在具有指针成员的类中编译默认的复制构造函数/赋值运算符重载