Программирование >>  Операторы преобразования типа 

1 ... 221 222 223 [ 224 ] 225 226 227 ... 239


лиотека С-ь+ поддерживает все специализации, у которых в первом аргументе шаблона передается тип 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 base::alnum

Буквы и цифры (эквивалент alphadlgjt)

ctype base::alpha

Буквы ,

ctype base:;cntrl

Управляющие символы



Выражение

Описание

ctype base::diglt

Десятичные цифры

ctype base:: graph

Знаки препинания, буквы и цифры (эквивалент alnumpunct)

ctype base:: lower

Буквы нижнего регистра

ctype base::pnnt

Печатные символы

ctype base::punct

Знаки препинания

ctype base::space

Пропуски

ctype base::upper

Буквы верхнего регистра

ctype base::xdlglt

Шестнадцатеричные цифры

Специализации ctype для типа char

Чтобы повысить эффективность работы функций классификации символов, фацет ctype специализируется для типа символов char. Специализация не перепоручает функции классификации символов (is(), scan() и scannot()) соответствующим виртуальным функциям. Вместо этого задействуется непосредственная реализация функций с использованием поиска по таблице категорий, для чего в фацете определяются дополнительные члены (табл. 14.18).

Таблица 14.18. Дополнительные члены ctype<char>

Выражение

Описание

ctype<char>: :table sl2e

Размер таблицы (>=256)

ctype<char>::classlcjable()

Возвращает таблицу категорий для классического

локального контекста С

ctype<char>(table, del=false)

Создает фацет с таблицей категорий table

cttableO

Возвращает текущую таблицу категорий для фацета ct

Чтобы изменить поведение этих функций для конкретного локального контекста, передайте соответствующую таблицу категорий в аргументе конструктора:

Создание и инициализация таблицы

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 является константой, определенной реализацией библиотеки и хранящей размер таблицы категорий. Таблица должна



1 ... 221 222 223 [ 224 ] 225 226 227 ... 239

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика