std::char_traits
来自 cppreference.com
定义于头文件 <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 |
除此之外,标准特化还定义了成员类型 |
(自 C++20 起) |
[编辑] 成员函数
标准特化定义了 CharTraits 所需的以下静态成员函数
[静态] |
分配一个字符 (公共静态成员函数) |
[静态] |
比较两个字符 (公共静态成员函数) |
[静态] |
将一个字符序列移动到另一个字符序列上 (公共静态成员函数) |
[静态] |
复制一个字符序列 (公共静态成员函数) |
[静态] |
按字典顺序比较两个字符序列 (公共静态成员函数) |
[静态] |
返回一个字符序列的长度 (公共静态成员函数) |
[静态] |
在一个字符序列中查找一个字符 (公共静态成员函数) |
[静态] |
将 int_type 转换为等效的 char_type (公共静态成员函数) |
[静态] |
将 char_type 转换为等效的 int_type (公共静态成员函数) |
[静态] |
比较两个 int_type 值(公共静态成员函数) |
[静态] |
返回一个 eof 值 (公共静态成员函数) |
[静态] |
检查一个字符是否为 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) 并提供高级输出接口 (类模板) | |
抽象一个原始设备 (类模板) |