Namespaces
Variants

std:: char_traits

From cppreference.net
Определено в заголовочном файле <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 .

(since C++20)

Функции-члены

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

[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

Смотрите также

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