Spec-Zone.ru › C++

std::char_traits

Определён в заголовочном файле <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 unsignedint 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:

assign
[static]
присваивает значение символу
(открытая статическая функция-член)
eqlt
[static]
сравнивает два символа
(открытая статическая функция-член)
move
[static]
перемещает одну последовательность символов на место другой
(открытая статическая функция-член)
copy
[static]
копирует последовательность символов
(открытая статическая функция-член)
compare
[static]
лексикографически сравнивает две последовательности символов
(открытая статическая функция-член)
length
[static]
возвращает длину последовательности символов
(открытая статическая функция-член)
find
[static]
находит символ в последовательности символов
(открытая статическая функция-член)
to_char_type
[static]
преобразует int_type в эквивалентный char_type
(открытая статическая функция-член)
to_int_type
[static]
преобразует char_type в эквивалентный int_type
(открытая статическая функция-член)
eq_int_type
[static]
сравнивает два значения int_type
(открытая статическая функция-член)
eof
[static]
возвращает значение eof
(открытая статическая функция-член)
not_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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/char_traits

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API