|
Программирование >> Операторы преобразования типа
лиотека С-ь+ поддерживает все специализации, у которых в первом аргументе шаблона передается тип char или wcharj:, а во втором - тип итератора ввода. Хранение таких специализаций в каждом лoкaлыioм контексте не обязательно. Классификация и преобразования символов в стандартной библиотеке С++ определены два фацета для работы с символами: ctype и codecvt. Оба фацета относятся к категории locale; :ctype. Фацет ctype используется в основном при классификации символов (например, проверки того, является ли символ буквой). Кроме того, в нем предусмотрены методы смены регистра символов, а также преобразования между char и типом символов, для которого был специализирован данный фацет. Фацет codecvt обеспечивает смену кодировок символов и используется в основном шаблоном basic filebuf для преобразования между внутренними и внешними представлениями. Классификация символов Фацет ctype представляет собой шаблон, параметризованный по типу символов. Класс ctype<charT> поддерживает три категории функций: О функции преобразования между типами char и charT; О функции классификации символов; О функции преобразования к верхнему и нижнему регистрам. Функции фацета ctype перечислены в табл. 14.16. Таблица 14.16. Функции фацета ctype Выражение Описание ct.is(m, с) Проверяет, соответствует ли символ с маске m ct.is(beg, end, vec) Для каждого символа в интервале между beg и end сохраняет маску символа в соответствующей позиции vec ct.scan ls(m, beg, end) Возвращает указатель на первый символ в интервале между beg и end, соответствующий маске т, или end при отсутствии таких символов ct.scan not(m, beg, end) Возвращает указатель на первый символ в интервале между beg и end, не соответствующий маске т, или end, если все символы соответствуют заданной маске ct.toupper(c) Возвращает букву верхнего регистра, соответствующую символу с. Если такой буквы не существует, возвращает с ct.toupper(beg, end) Преобразует все буквы в интервале между beg и end; каждая буква заменяется результатом вызова toupper() ct.tolower(c) Возвращает букву нижнего регистра, соответствующую символу с. Если такой буквы не существует, возвращает с ct. tolower (beg, end) Преобразует все буквы в интервале между beg и end; каждая буква заменяется результатом вызова tolower() Таблица 14.16 (продолжение) Выражение Описание ct.widen(c) Возвращает символ char с, преобразованный к типу charT ct.widen(beg, end, dest) Для каждого символа в интервале между beg и end помещает результат вызова widen() в соответствующую позицию dest ctnarrow(c, default) Возвращает символ charT с, преобразованный к типу char, или символ default, если такого символа не существует ct.narrow(beg, end, default, dest) Для каждого символа в интервале между beg и end помещает результат вызова narrow() в соответствующую позицию dest Функция \s{beg,end,vec) сохраняет в массиве маски символов. Для каждого символа в интервале между beg и end в массиве, на который ссылается аргумент vec, сохраняется маска с установкой соответствующих атрибутов символов. Использование этой функции позволяет избежать многократных вызовов виртуальных функций при большом количестве классифицируемых символов. Функция wlden() преобразует символ типа char из исходной кодировки в кодировку, используемую локальным контекстом. Это означает, что вызов wlden() может быть оправдан даже в том случае, если результат тоже относится к типу char. Обратное преобразование осуществляется функцией narrow(), которая преобразует символ из кодировки, используемой локальным контекстом, в соответствующий символ char (при условии, что такой символ существует). В следующем фрагменте строка с десятичными цифрами преобразуется из типа char в wchar t: std::locale loc; char narrow[] = 0123456789 : wchar t w1de[l0]: std::use facet<std::ctype<wchar t> >(1oc),w1den(narrow. narrow+lO. wide); Класс ctype является производным от класса ctype base. Этот класс используется только для определения перечисляемого типа mask. В перечисляемом типе задаются значения, сочетание которых образует битовую маску для проверки свойств символов. Значения, определенные в классе ctype base, перечислены в табл. 14.17. Функциям классификации символов передается битовая маска, которая представляет собой комбинацию этих значений с поразрядными операторами I, &, и ~. Символ совпадает с маской только в том случае, если он принадлежит хотя бы к одной категории, определяемой этой маской. Таблица 14.17. Маски символов, используемые фацетом ctype
Специализации ctype для типа char Чтобы повысить эффективность работы функций классификации символов, фацет ctype специализируется для типа символов char. Специализация не перепоручает функции классификации символов (is(), scan() и scannot()) соответствующим виртуальным функциям. Вместо этого задействуется непосредственная реализация функций с использованием поиска по таблице категорий, для чего в фацете определяются дополнительные члены (табл. 14.18). Таблица 14.18. Дополнительные члены ctype<char>
Чтобы изменить поведение этих функций для конкретного локального контекста, передайте соответствующую таблицу категорий в аргументе конструктора: Создание и инициализация таблицы std;:ctype base::mask mytable[std:;ctype<char>::table slze] = { }: Использовать таблицу для фацета ct типа ctype<char> std::ctype<char> ct(mytable.false); Фрагмент конструирует фацет ctype<char>, который классифицирует символы по таблице mytable. Точнее говоря, класс символа с определяется выражением: mytable[stat1c cast<uns1gned char>(c)] Статическая переменная table size является константой, определенной реализацией библиотеки и хранящей размер таблицы категорий. Таблица должна
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |