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 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:

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/w/cpp/string/char_traits

Spec-Zone.ru

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