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 |
||
| Кроме того, стандартные специализации также определяют тип-член | (с C++20) |
Члены-функции
Стандартные специализации определяют следующие статические члены-функции, требуемые CharTraits:
|
[static] | присваивает символ (публичная статическая функция-член) |
|
[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
См. также
| хранит и обрабатывает последовательности символов (шаблон класса) |
|
|
(C++17) | только для чтения представление строки (шаблон класса) |
оборачивает заданное абстрактное устройство (std::basic_streambuf)и предоставляет интерфейс ввода высокого уровня (шаблон класса) |
|
оборачивает заданное абстрактное устройство (std::basic_streambuf)и предоставляет интерфейс вывода высокого уровня (шаблон класса) |
|
| абстрагирует физическое устройство (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/string/char_traits