На этом шаге мы рассмотрим фацет, используемый для интернационализации сообщений.
Фацет messages предназначен для выборки интернационализированных сообщений из каталога. В основном он используется для предоставления сервиса, аналогичного функции perror(). В POSIX-совместимых системах эта функция выводит системное сообщение об ошибке, номер которой хранится в глобальной переменной errno. Фацет messages гораздо более универсален. К сожалению, в спецификации он определен недостаточно четко.
Фацет messages представляет собой шаблон класса, получающий в аргументе шаблона тип символов charT. Строки, возвращаемые этим фацетом, относятся к типу basic_string<charT>. Базовая схема использования шаблона основана на открытии каталога, чтении сообщений и закрытии каталога. Класс messages объявлен производным от класса messages_base, в котором определяется тип catalog (в действительности это определение типа для int). Объект типа catalog идентифицирует каталог, с которым работают функции фацета messages. В таблице 1 приведен список этих функций.
Выражение | Описание |
---|---|
msg.open(name, loc) | Открывает каталог и возвращает соответствующий идентификатор |
msg.get(cat, set, msgid, def) | Возвращает сообщение с идентификатором msgid из каталога cat; если такое сообщение отсутствует, возвращает def |
msg.close(cat) | Закрывает каталог cat |
Имя, передаваемое в аргументе функции open(), идентифицирует каталог, в котором хранятся строки сообщений. Например, это может быть имя файла. В аргументе loc передается объект locale, используемый для обращения к фацету ctype. Фацет обеспечивает преобразование сообщений к нужному типу символов.
Точная семантика функции get() не определена. Например, реализация для POSIX-совместимой системы может вернуть строку, соответствующую сообщению об ошибке msgid, но такое поведение не является обязательным по требованиям стандарта. Аргумент set предназначен для дополнительного структурирования сообщений, например, чтобы различать системные ошибки и ошибки стандартной библиотеки C++.
После выполнения необходимых операций каталог сообщений освобождается функцией close(). Хотя интерфейс open()/close() предполагает, что сообщения читаются из файла по мере необходимости, такое поведение не является обязательным. Например, более вероятно, что функция ореn() прочитает файл и сохранит сообщения в памяти. Последующий вызов close() освободит эту память.
Стандарт требует, чтобы в каждом локальном контексте хранились две специализации - messages<char> и messages<wchar_t>. Другие специализации стандартной библиотекой C++ не поддерживаются.
Со следующего шага мы начнем рассматривать распределители папмяти.