std:: char_traits
|
定义于头文件
<string>
|
||
|
template
<
class
CharT
|
||
char_traits
类是一个特征类模板,用于为给定字符类型抽象化基本的字符和字符串操作。其定义的操作集使得通用算法几乎总能基于它来实现。因此,只需提供自定义的
char_traits
类,就可以将此类算法用于几乎任何可能的字符或字符串类型。
char_traits
类模板作为显式实例化的基础。用户可为任意自定义字符类型
提供特化
。标准库已为标准字符类型提供了若干显式特化(详见下文),其他特化无需满足
CharTraits
的要求。
目录 |
特化
标准库提供了以下标准特化:
|
定义于头文件
<string>
|
|
| std :: char_traits < char > | char 的标准字符特性 |
| std :: char_traits < wchar_t > | wchar_t 的标准字符特性 |
| std :: char_traits < char8_t > (C++20) | char8_t 的标准字符特性 |
| std :: char_traits < char16_t > (C++11) | char16_t 的标准字符特性 |
| std :: char_traits < char32_t > (C++11) | char32_t 的标准字符特性 |
所有这些特化都满足 CharTraits 的要求。
成员类型
标准特化定义了 CharTraits 所要求的以下成员类型:
CharT
|
成员类型 | ||||
|---|---|---|---|---|---|
char_type
|
int_type
|
off_type
|
pos_type
|
state_type
|
|
| char | char | int | std::streamoff | std::streampos | std::mbstate_t |
| wchar_t | wchar_t | std::wint_t | std::wstreampos | ||
| char8_t | char8_t | unsigned int | std::u8streampos | ||
| char16_t | char16_t | std::uint_least16_t | std::u16streampos | ||
| char32_t | char32_t | std::uint_least32_t | std::u32streampos | ||
|
此外,标准特化还定义了成员类型
|
(since C++20) |
成员函数
标准特化定义了以下由 CharTraits 要求的静态成员函数:
|
[static]
|
赋值字符
(公开静态成员函数) |
|
[static]
|
比较两个字符
(公开静态成员函数) |
|
[static]
|
将一个字符序列移动到另一个
(公开静态成员函数) |
|
[static]
|
复制字符序列
(公开静态成员函数) |
|
[static]
|
按字典序比较两个字符序列
(公开静态成员函数) |
|
[static]
|
返回字符序列的长度
(公开静态成员函数) |
|
[static]
|
在字符序列中查找字符
(公开静态成员函数) |
|
[static]
|
将
int_type
转换为等价的
char_type
(公开静态成员函数) |
|
[static]
|
将
char_type
转换为等价的
int_type
(公开静态成员函数) |
|
[static]
|
比较两个
int_type
值
(公开静态成员函数) |
|
[static]
|
返回
eof
值
(公开静态成员函数) |
|
[static]
|
检查字符是否为
eof
值
(公开静态成员函数) |
注释
CharTraits
并不要求将上述类型和函数定义为直接成员,它仅要求像
X::type
这样的类型以及像
X
::
func
(
args
)
这样的表达式是有效的,并具有所需的语义。用户定义的字符特征可以从其他字符特征类派生,并且仅重写其部分成员,请参见以下示例。
示例
用户定义的字符特征可用于提供 不区分大小写的比较 :
#include <cctype> #include <iostream> #include <string> #include <string_view> struct ci_char_traits : public std::char_traits<char> { static char to_upper(char ch) { return std::toupper((unsigned char) ch); } static bool eq(char c1, char c2) { return to_upper(c1) == to_upper(c2); } static bool lt(char c1, char c2) { return to_upper(c1) < to_upper(c2); } static int compare(const char* s1, const char* s2, std::size_t n) { while (n-- != 0) { if (to_upper(*s1) < to_upper(*s2)) return -1; if (to_upper(*s1) > to_upper(*s2)) return 1; ++s1; ++s2; } return 0; } static const char* find(const char* s, std::size_t n, char a) { const auto ua{to_upper(a)}; while (n-- != 0) { if (to_upper(*s) == ua) return s; s++; } return nullptr; } }; template<class DstTraits, class CharT, class SrcTraits> constexpr std::basic_string_view<CharT, DstTraits> traits_cast(const std::basic_string_view<CharT, SrcTraits> src) noexcept { return {src.data(), src.size()}; } int main() { using namespace std::literals; constexpr auto s1 = "Hello"sv; constexpr auto s2 = "heLLo"sv; if (traits_cast<ci_char_traits>(s1) == traits_cast<ci_char_traits>(s2)) std::cout << s1 << " and " << s2 << " are equal\n"; }
输出:
Hello and heLLo are equal
参见
|
存储并操作字符序列
(类模板) |
|
|
(C++17)
|
只读字符串视图
(类模板) |
|
包装给定的抽象设备 (
std::basic_streambuf
)
并提供高级输入接口 (类模板) |
|
|
包装给定的抽象设备 (
std::basic_streambuf
)
并提供高级输出接口 (类模板) |
|
|
抽象原始设备
(类模板) |