Шаг 535.
Библиотека STL.
Интернационализация. Строение фацетов

    На этом шаге мы приведем требования и рекомендации по созданию собственных фацетов.

    Возможности локального контекста определяются содержащимися в нем фацетами. Все локальные контексты заведомо содержат минимальный набор стандартных фацетов. В описаниях отдельных фацетов, приведенных далее, указано, какие специализации гарантированно присутствуют в контексте. Помимо перечисленных реализация стандартной библиотеки C++ может включить в локальный контекст дополнительные фацеты. Важно понимать, что пользователь также может добавить собственные фацеты или установить их вместо стандартных фацетов. На 533 шаге рассматривается процедура установки фацета в локальном контексте. Например, класс germanBoolNames был объявлен производным от класса numpunct_byname<char> одного из стандартных фацетов и установлен в локальном контексте при помощи конструктора, в аргументах которого передаются локальный контекст и фацет. Но что нужно для того, чтобы создать собственный фацет? В качестве фацета может использоваться любой класс F, удовлетворяющий двум требованиям.

    Стандартные фацеты соответствуют не только этим требованиям, но и некоторым специальным рекомендациям - не обязательным, но весьма полезным.

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

    Для большинства стандартных фацетов определяется версия с суффиксом _byname. Она является производной от стандартного фацета и создает специализацию для соответствующего имени локального контекста. Так, класс numpunct_ byname создает фацет numpunct для локального контекста с заданным именем. Например, команда создания немецкого фацета numpunct может выглядеть так:

  std::numpunct_byname("de_DE")

    Классы _byname создаются в процессе внутренней работы конструкторов локального контекста, получающих имя в виде аргумента. Для каждого стандартного фацета, поддерживающего имя, конструирование экземпляра этого фацета производится соответствующим классом _byname.

    На следующем шаге мы рассмотрим числовое форматирование.




Предыдущий шаг Содержание Следующий шаг