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 |
||
| Кроме того, стандартные специализации определяют тип-член | (начиная с 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/cpp/string/char_traits