Пространства имён
Варианты
Действия

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_category как std::strong_ordering.

(начиная с C++20)

[править] Функции-элементы

Стандартные специализации определяют следующие статические функции-элементы, необходимые для CharTraits:

[static]
присваивает символ
(public static функция-элемент) [править]
[static]
сравнивает два символа
(public static функция-элемент) [править]
[static]
перемещает одну последовательность символов в другую
(public static функция-элемент) [править]
[static]
копирует последовательность символов
(public static функция-элемент) [править]
[static]
лексикографически сравнивает две последовательности символов
(public static функция-элемент) [править]
[static]
возвращает длину последовательности символов
(public static функция-элемент) [править]
[static]
ищет символ в последовательности символов
(public static функция-элемент) [править]
преобразует int_type в эквивалентный char_type
(public static функция-элемент) [править]
[static]
преобразует char_type в эквивалентный int_type
(public static функция-элемент) [править]
[static]
сравнивает два значения int_type
(public static функция-элемент) [править]
[static]
возвращает значение eof
(public static функция-элемент) [править]
[static]
проверяет, имеет ли символ значение eof
(public static функция-элемент) [править]

[править] Примечание

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 << " и " << s2 << " равны\n";
}

Вывод:

Hello и heLLo равны

[править] Смотрите также

хранит и управляет последовательностями символов
(шаблон класса) [править]
строковое представление только для чтения
(шаблон класса) [править]
обёртывает данное абстрактное устройство (std::basic_streambuf)
и предоставляет интерфейс ввода высокого уровня
(шаблон класса) [править]
обёртывает данное абстрактное устройство (std::basic_streambuf)
и предоставляет интерфейс вывода высокого уровня
(шаблон класса) [править]
абстрагирует необработанное устройство
(шаблон класса) [править]