std:: char_traits
|
Определено в заголовочном файле
<string>
|
||
|
template
<
class
CharT
|
||
Класс
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 | ||
|
Кроме того, стандартные специализации также определяют тип-член
|
(since 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
)
и предоставляет высокоуровневый интерфейс вывода (шаблон класса) |
|
|
абстрагирует низкоуровневое устройство
(шаблон класса) |