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 |
Кроме того, стандартные специализации также определяют тип элемент |
(начиная с C++20) |
[править] Функции-элементы
Стандартные специализации определяют следующие статические функции-элементы, необходимые для CharTraits:
[static] |
присваивает символ (public static функция-элемент) |
[static] |
сравнивает два символа (public static функция-элемент) |
[static] |
перемещает одну последовательность символов в другую (public static функция-элемент) |
[static] |
копирует последовательность символов (public static функция-элемент) |
[static] |
лексикографически сравнивает две последовательности символов (public static функция-элемент) |
[static] |
возвращает длину последовательности символов (public static функция-элемент) |
[static] |
ищет символ в последовательности символов (public static функция-элемент) |
[static] |
преобразует int_type в эквивалентный char_type (public static функция-элемент) |
[static] |
преобразует char_type в эквивалентный int_type (public static функция-элемент) |
[static] |
сравнивает два значения int_type (public static функция-элемент) |
[static] |
возвращает значение eof (public static функция-элемент) |
[static] |
проверяет, имеет ли символ значение eof (public static функция-элемент) |
[править] Примечание
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 << " и " << s2 << " равны\n"; }
Вывод:
Hello и heLLo равны
[править] Смотрите также
хранит и управляет последовательностями символов (шаблон класса) | |
(C++17) |
строковое представление только для чтения (шаблон класса) |
обёртывает данное абстрактное устройство (std::basic_streambuf) и предоставляет интерфейс ввода высокого уровня (шаблон класса) | |
обёртывает данное абстрактное устройство (std::basic_streambuf) и предоставляет интерфейс вывода высокого уровня (шаблон класса) | |
абстрагирует необработанное устройство (шаблон класса) |