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

    На этом шаге мы рассмотрим средства работы с числами, которые представлены строкой.

    Фацет num_get предназначен для лексического разбора текстовых представлений чисел. По аналогии с num_put он оформляется в виде шаблона с двумя аргументами: типом символов charT и типом итератора ввода InIt, который по умолчанию равен istreambuf_iterator<charT>. Фацет поддерживает набор функций get(), различающихся только по типу последнего аргумента. Пример использования фацета num_get:

std::locale    loc;              // Локальный контекст
InIt           beg = ...;        // Начало входной последовательности
InIt           end = ...;        // Конец входной последовательности
std::ios_base& fmt = ...;        // Поток, определяющий формат ввода
std::ios_base::iostate err;      // Состояние после вызова
T              value = ...;      // Значение после успешного вызова

// Получение фацета разбора числовых данных для контекста loc
const std::num_get<charT,InIt>& ng
 = std::use_facet<std::num_get<charT,InIt> >(loc);

// Чтение данных с использованием фацета
ng.get(beg, end, fmt, err, value);

    В этом фрагменте делается попытка выполнить разбор числового значения, соответствующего типу Т, из последовательности символов между beg и end. Формат предполагаемого числового значения определяется аргументом fmt. Если разбор завершается неудачей, в переменной еrr устанавливается флаг ios_base::failbit; если все прошло нормально, состояние ios_base::goodbit сохраняется в err, а полученное значение - в value. Переменная value изменяется только в случае успешного разбора. Если вся последовательность символов была полностью использована, функция get() возвращает второй параметр (end). В противном случае возвращается итератор, указывающий на первый символ, который не был обработан как часть числового значения.

    Фацет num_get содержит функции чтения для типов bool, long, unsigned short, unsigned int, unsigned long, float, double и long double. Некоторые из этих типов (например, unsigned short) не имеют соответствующих функций в фацете num_put. Дело в том, что вывод значения типа unsigned short дает такой же результат, что и вывод значения типа unsigned short, приведенного к типу unsigned long. С другой стороны, чтение значения типа unsigned long с последующим преобразованием к unsigned short может дать результат, отличный от прямого чтения unsigned short.

    Стандарт требует, чтобы в каждом локальном контексте хранились две специализации num_get<char> и num_get<wchar_t> (в обеих специализациях для второго аргумента используется значение по умолчанию). Кроме того, стандартная библиотека C++ поддерживает все специализации, у которых в первом аргументе шаблона передается тип символа, а во втором - тип итератора вывода. Как и в случае с num_put, стандарт не требует, чтобы эти специализации хранились в каждом локальном контексте.

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




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