Шаг 538.
Библиотека STL.
Интернационализация. Числовое форматирование. Форматирование

    На этом шаге мы рассмотрим определение способов форматирования.

    Фацет 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++ поддерживает все специализации, у которых в первом аргументе шаблона передается тип символа, а во втором - тип итератора вывода. Конечно, стандарт не требует, чтобы эти специализации хранились в каждом локальном контексте, потому что в этом случае количество фацетов оказалось бы бесконечным.

    На следующем шаге мы рассмотрим лексический разбор.




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