using category = int;
Valid category значения включают в себяlocale член битовая маска элементы collate, ctype, monetary, numeric, time, и messages, каждый из которых представляет одну категорию локали. Кроме того, locale константа битовой маски элемента none определяется как ноль и не представляет категории. И locale постоянный член битовой маски all определяются таким образом, что выражение
(collate | ctype | monetary | numeric | time | messages | all) == all
есть true, и представляет собой объединение всех категорий. Кроме того, выражение (X | Y), где X и Y каждое представляет одну категорию, представляет собой объединение двух категорий.
locale Функции-члены, ожидающие category аргумента, требуют одного из category значений, определенных выше, или объединения двух или более таких значений. Такое category значение определяет набор категорий локали. Каждая категория языкового стандарта, в свою очередь, определяет набор аспектов языкового стандарта, включая, по крайней мере, те, которые показаны в таблице 69.
Категория | Включает грани |
сопоставлять | collate<char>, collate<wchar_t> |
ctype | ctype<char>, ctype<wchar_t> |
codecvt<char, char, mbstate_t> | |
codecvt<char16_t, char, mbstate_t> | |
codecvt<char32_t, char, mbstate_t> | |
codecvt<wchar_t, char, mbstate_t> | |
денежный | moneypunct<char>, moneypunct<wchar_t> |
moneypunct<char, true>, moneypunct<wchar_t, true> | |
money_get<char>, money_get<wchar_t> | |
money_put<char>, money_put<wchar_t> | |
числовой | numpunct<char>, numpunct<wchar_t> |
num_get<char>, num_get<wchar_t> | |
num_put<char>, num_put<wchar_t> | |
время | time_get<char>, time_get<wchar_t> |
time_put<char>, time_put<wchar_t> | |
Сообщения | messages<char>, messages<wchar_t> |
Для любой локали loc , созданной или возвращенной locale::classic(), и любого аспекта, Facet показанного в таблице 69, has_facet<Facet>(loc) есть true. Каждая locale функция-член, которая принимает locale::category аргумент, работает с соответствующим набором аспектов.
Реализация требуется для предоставления этих специализаций для шаблонов аспектов, определенных как члены категории, и для тех, которые показаны в таблице 70.
Категория | Включает грани |
сопоставлять | collate_byname<char>, collate_byname<wchar_t> |
ctype | ctype_byname<char>, ctype_byname<wchar_t> |
codecvt_byname<char, char, mbstate_t> | |
codecvt_byname<char16_t, char, mbstate_t> | |
codecvt_byname<char32_t, char, mbstate_t> | |
codecvt_byname<wchar_t, char, mbstate_t> | |
денежный | moneypunct_byname<char, International> |
moneypunct_byname<wchar_t, International> | |
money_get<C, InputIterator> | |
money_put<C, OutputIterator> | |
числовой | numpunct_byname<char>, numpunct_byname<wchar_t> |
num_get<C, InputIterator>, num_put<C, OutputIterator> | |
время | time_get<char, InputIterator> |
time_get_byname<char, InputIterator> | |
time_get<wchar_t, InputIterator> | |
time_get_byname<wchar_t, InputIterator> | |
time_put<char, OutputIterator> | |
time_put_byname<char, OutputIterator> | |
time_put<wchar_t, OutputIterator> | |
time_put_byname<wchar_t, OutputIterator> | |
Сообщения | messages_byname<char>, messages_byname<wchar_t> |
Предоставленная реализация членов фасетов num_get<charT> и num_put<charT> вызовов use_facet<F>(l) только для фасетов F типов numpunct<charT> и ctype<charT>, а для локали l значение, полученное путем вызова member getloc() для ios_base& аргумента этих функций.
В объявлениях фасетов параметр шаблона с именем InputIterator или OutputIterator указывает набор всех возможных специализаций параметров, которые удовлетворяют требованиям итератора ввода или итератора вывода, соответственно ([iterator.requirements]). Параметр шаблона с именем C представляет собой набор типов , содержащих char, wchar_tи любых других реализации определенных типов символов , которые удовлетворяют требования , предъявляемые к характеру , на которых любые из компонентов iostream может быть реализованным. Параметр шаблона с именем International представляет собой набор всех возможных специализаций для параметра типа bool.
namespace std { class locale::facet { protected: explicit facet(size_t refs = 0); virtual ~facet(); facet(const facet&) = delete; void operator=(const facet&) = delete; }; }
Класс facet - это базовый класс для наборов функций локали. Класс - это класс, facet если он является производным от другого аспекта или если он является производным от класса locale::facet и содержит следующее публично доступное объявление:231
static ::std::locale::id id;
Параметры шаблона в этом разделе, которые должны быть фасетами, являются теми, которые указаны Facet в объявлениях. Программа, которая передает тип, который является not фасетом, или тип, который ссылается на фасет с изменяемым атрибутом в качестве (явного или выведенного) параметра шаблона в функцию языкового стандарта, ожидающую фасета, имеет неправильный формат. Фасет с константой является допустимым аргументом шаблона для любой функции локали, которая ожидает параметр шаблона Facet.
refs Аргумент конструктора используется для управления жизненным циклом. Для refs == 0реализации выполняется delete static_cast<locale::facet*>(f) (где f - указатель на фасет), когда последний locale объект, содержащий фасет, уничтожается; ведь refs == 1реализация никогда не разрушает фасет.
Конструкторы всех фасетов, определенных в этом разделе, принимают такой аргумент и передают его конструктору своего facet базового класса. Все конструкторы с одним аргументом, определенные в этом разделе explicit, предотвращают их участие в автоматических преобразованиях.
Для некоторых стандартных аспектов…_bynameпроизводный от него стандартный класс « » реализует семантику виртуальных функций, эквивалентную этому аспекту локали, созданного locale(const char*) с помощью того же имени. Каждый такой аспект предоставляет конструктор, который принимает const char* аргумент, который называет локаль, и refs аргумент, который передается конструктору базового класса. Каждый такой аспект также предоставляет конструктор, который принимает string аргумент str и refs аргумент, который имеет тот же эффект, что и вызов первого конструктора с двумя аргументами str.c_str() и refs. Если нет «…_byname» версии фасета, базовый класс сам реализует именованную семантику локали, ссылаясь на другие фасеты.
Это полный список требований; других требований нет. Таким образом, класс фасета не обязательно должен иметь общедоступный конструктор копирования, присваивание, конструктор по умолчанию, деструктор и т. Д.
namespace std { class locale::id { public: id(); void operator=(const id&) = delete; id(const id&) = delete; }; }
Класс locale::id обеспечивает идентификацию интерфейса фасета локали, используемого в качестве индекса для поиска и инкапсуляции инициализации.
[ Note: Поскольку фасеты используются iostreams, потенциально во время работы статических конструкторов их инициализация не может зависеть от запрограммированной статической инициализации. Одна стратегия инициализации заключается locale в инициализации каждогоid члена фасета при первой установке экземпляра фасета в локаль. Это зависит только от нуля статического хранилища перед запуском конструктора ([basic.start.static]). ] — end note