На этом шаге мы рассмотрим определение способов форматирования.
Фацет num_put обеспечивает текстовое форматирование чисел. Он представляет собой шаблон класса с двумя аргументами: тип charT определяет символы, создаваемые при выводе, а тип OutIt определяет итератор вывода для записи сгенерированных символов. По умолчанию итератор вывода относится к типу ostreambuf_ iterator<charT>. Фацет num_put поддерживает семейство функций, которые называются put() и различаются только по последнему аргументу. Пример использования фацета num_put:
std::locale loc; OutIt to = ...; std::ios_base& fmt = ...; charT fill = ...; T value = ...; // // Получение фацета числового форматирования для контекста loc const std::num_put<charT,OutIt>& np = std::use_facet<std::num_put<charT,OutIt> >(loc); // Вывод данных с использованием фацета np.put(to, fmt, fill, value);
Приведенный фрагмент строит текстовое представление значения value с помощью символов типа charT и выводит их через итератор вывода to. Формат вывода определяется флагами форматирования, хранящимися в fmt, а символ fill используется в качестве заполнителя. Функция put() возвращает итератор для позиции, следующей за последним из выведенных символов.
Фацет num_put содержит функции для типов bool, long, unsigned long, double, long double и void*, передаваемых в последнем аргументе, и не содержит функций для таких типов, как short или int, но это не вызывает проблем, поскольку соответствующие значения базовых типов в случае необходимости автоматически преобразуются к поддерживаемым типам.
Стандарт требует, чтобы в каждом локальном контексте хранились две специализации num_put<char> и num_put<wchar_t> (в обеих специализациях для второго аргумента используется значение по умолчанию). Кроме того, стандартная библиотека C++ поддерживает все специализации, у которых в первом аргументе шаблона передается тип символа, а во втором - тип итератора вывода. Конечно, стандарт не требует, чтобы эти специализации хранились в каждом локальном контексте, потому что в этом случае количество фацетов оказалось бы бесконечным.
На следующем шаге мы рассмотрим лексический разбор.