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