На этом шаге мы приведем требования и рекомендации по созданию собственных фацетов.
Возможности локального контекста определяются содержащимися в нем фацетами. Все локальные контексты заведомо содержат минимальный набор стандартных фацетов. В описаниях отдельных фацетов, приведенных далее, указано, какие специализации гарантированно присутствуют в контексте. Помимо перечисленных реализация стандартной библиотеки C++ может включить в локальный контекст дополнительные фацеты. Важно понимать, что пользователь также может добавить собственные фацеты или установить их вместо стандартных фацетов. На 533 шаге рассматривается процедура установки фацета в локальном контексте. Например, класс germanBoolNames был объявлен производным от класса numpunct_byname<char> одного из стандартных фацетов и установлен в локальном контексте при помощи конструктора, в аргументах которого передаются локальный контекст и фацет. Но что нужно для того, чтобы создать собственный фацет? В качестве фацета может использоваться любой класс F, удовлетворяющий двум требованиям.
Стандартные фацеты соответствуют не только этим требованиям, но и некоторым специальным рекомендациям - не обязательным, но весьма полезным.
Следующее описание стандартных фацетов относится только к открытым функциям. Чтобы изменить фацет, всегда приходится переопределять соответствующие защищенные функции. Определение функций с таким же интерфейсом, как у открытых функций фацета, всего лишь перегрузит их, поскольку эти функции не являются виртуальными.
Для большинства стандартных фацетов определяется версия с суффиксом _byname. Она является производной от стандартного фацета и создает специализацию для соответствующего имени локального контекста. Так, класс numpunct_ byname создает фацет numpunct для локального контекста с заданным именем. Например, команда создания немецкого фацета numpunct может выглядеть так:
std::numpunct_byname("de_DE")
Классы _byname создаются в процессе внутренней работы конструкторов локального контекста, получающих имя в виде аргумента. Для каждого стандартного фацета, поддерживающего имя, конструирование экземпляра этого фацета производится соответствующим классом _byname.
На следующем шаге мы рассмотрим числовое форматирование.