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

1 ... 224 225 226 [ 227 ] 228 229 230 ... 239


в порядке, нужном для пользователя, можно задействовать фацет collate. Функции этого фацета перечислены в табл. 14.23. Col обозначает специализацию collate, а в аргументах функций передаются итераторы, используемые для определения строк.

Таблица 14.23. Функции фацета collate Выражение Описание

col.compare(begl, endl, beg2, end2) Возвращаемое значение равно 1, если первая строка

больше второй; О, если строки равны; -1, если первая строка меньше второй

col.transform(beg, end) Возвращает строку, предназначенную для сравнения

с другими преобразованными строками

col.hash(beg, end) Возвращает хэш-код строки (типа long)

Фацет collate представляет собой шаблон класса, получающий в аргументе шаблона тип символов charT. Строки, передаваемые функциям collate, задаются при помощи указателей const charT*. Это несколько неудобно, поскольку нет гарантии, что итераторы, используемые типом basic string<charT>, также представляют собой указатели. Следовательно, сравнение строк должно производиться фрагментами следующего вида:

locale loc; string si. s2;

Получение фацета collate локального контекста locale const std::collate<charT>&col = stdLLuse facet<std::collate<charT> >Cloc):

Сравнение строк с использованием фацета collate

lnt result = col .compare(sl.data(). sl.dataO+sl.slzeO.

s2.data(). s2,data()+s2.size()):

If (result == 0) { si и s2 равны

Такие ограничения связаны с тем, что нужный тип итератора заранее не известен, а определять фацеты для типа указателя и бесконечного числа типов итераторов невозможно.

Конечно, для сравнения строк в классе locale существует специальная вспомогательная функция:

1nt result = loc(sl. s2);

Однако такое решение работает только с функцией compare(). В стандартной библиотеке С+-ь не определены вспомогательные функции для двух других функций collate.



Функция transformO возвращает объект типа basic string<charT>. Лексикографический порядок строк, возвращаемых функцией transformO, совпадает с порядком следования исходных строк, сортируемых функцией collate(). Функция transformO может использоваться для ускорения работы программы, если одна строка сравнивается с большим количеством других строк. Лексикографический порядок следования строк в этом случае определяется гораздо быстрее, чем при использовании collate(), поскольку национальные правила сортировки могут быть довольно сложными.

Стандартная библиотека С++ требует обязательной поддержки только двух специализаций - collate<char> и collate<wchar t>. Для других типов символов пользователи должны писать собственные специализации, в которых могут быть задействованы стандартные специализации.

Интернационализация сообщений

Фацет messages предназначен для выборки интернационализированных сообщений из каталога. В основном он используется для предоставления сервиса, аналогичного функции реггог(). В POSIX-совместимых системах эта функция выводит системное сообщение об ошибке, номер которой хранится в глобальной переменной errno. Фацет messages гораздо более универсален. К сожалению, в спецификации он определен недостаточно четко.

Фацет messages представляет собой шаблон класса, получающий в аргументе шаблона тип символов charT. Строки, возвращаемые этим фацетом, относятся к типу basic string<charT>. Базовая схема использования шаблона основана на открытии каталога, чтении сообщений и закрытии каталога. Класс messages объявлен производным от класса messages base, в котором определяется тип catalog (в действительности это определение типа для int). Объект типа catalog идентифицирует каталог, с которым работают функции фацета messages. В табл. 14.24 приведен список этих функций.

Таблица 14.24. Функции фацета messages Выражение Описание

msg.open(name, loc) Открывает каталог и возвращает соответствующий

идентификатор

msg.get(cat, set msgid, deO Возвращает сообщение с идентификатором msgid из каталога

cat; если такое сообщение отсутствует, возвращает def

msg.close(cat) Закрывает каталог cat

Имя, передаваемое в аргументе функции ореп(), идентифицирует каталог, в котором хранятся строки сообщений. Например, это может быть имя файла. В аргументе /ос передается объект locale, используемый для обращения к фацету ctype. Фацет обеспечивает преобразование сообщений к нужному типу символов.



Точная семантика функции get() не определена. Например, реализация для POSIX-совместимой системы может вернуть строку, соответствующую сообщению об ошибке msgid, но такое поведение не является обязательным по требованиям стандарта. Аргумент set предназначен для дополнительного структурирования сообщений, например, чтобы различать системные ошибки и ошибки стандартной библиотеки С++.

После выполнения необходимых операций каталог сообщений освобождается функцией close(). Хотя интерфейс open()/close() предполагает, что сообщения читаются из файла по мере необходимости, такое поведение не является обязательным. Например, более вероятно, что функция ореп() прочитает файл и сохранит сообщения в памяти. Последующий вызов dose() освободит эту память.

Стандарт требует, чтобы в каждом локальном контексте хранились две специализации - messages<char> и messages<wcharj:>. Другие специализации стандартной библиотекой С++ не поддерживаются.



1 ... 224 225 226 [ 227 ] 228 229 230 ... 239

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