命名空间
变体
操作

std::char_traits

来自 cppreference.com
< cpp‎ | string
定义于头文件 <string>
template<

    class CharT

> class char_traits;

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

除此之外,标准特化还定义了成员类型 comparison_categorystd::strong_ordering

(自 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

[编辑] 另请参阅

存储和操作字符序列
(类模板) [编辑]
只读字符串视图
(类模板) [编辑]
封装给定的抽象设备 (std::basic_streambuf)
并提供高级输入接口
(类模板) [编辑]
封装给定的抽象设备 (std::basic_streambuf)
并提供高级输出接口
(类模板) [编辑]
抽象一个原始设备
(类模板) [编辑]