std:: num_get
|
Определено в заголовочном файле
<locale>
|
||
|
template
<
class
CharT,
|
||
Класс
std::num_get
инкапсулирует правила для разбора строковых представлений числовых значений. В частности, поддерживаются типы
bool
,
unsigned
short
,
unsigned
int
,
long
,
unsigned
long
,
long
long
,
unsigned
long
long
(начиная с C++11)
,
float
,
double
,
long
double
и
void
*
. Стандартные операторы ввода форматирования (такие как
cin
>>
n
;
) используют аспект
std::num_get
локали потока ввода-вывода для разбора текстовых представлений чисел.
Диаграмма наследования
Если специализация
std::num_get
не гарантированно предоставляется стандартной библиотекой (см. ниже), поведение её функций
get()
и
do_get()
не гарантируется как указанное.
Содержание |
Специализации
Стандартная библиотека гарантированно предоставляет следующие специализации (они должны быть реализованы любым объектом локали ):
|
Определено в заголовке
<locale>
|
|
| std :: num_get < char > | создает парсинг узких строк для чисел |
| std :: num_get < wchar_t > | создает парсинг широких строк для чисел |
Кроме того, стандартная библиотека также гарантированно предоставляет каждую специализацию, удовлетворяющую следующим требованиям к типам:
-
CharTявляется одним из- char ,
- wchar_t , и
- любым другим определённым реализацией типом контейнера символов , который удовлетворяет требованиям для символа, на котором могут быть инстанцированы любые из компонентов iostream ; и
-
InputItдолжен удовлетворять требованиям LegacyInputIterator .
Вложенные типы
| Тип | Определение |
char_type
|
CharT
|
iter_type
|
InputIt
|
Члены данных
| Участник | Описание |
std::locale::id
id
[static]
|
идентификатор аспекта |
Функции-члены
создаёт новый
num_get
фасет
(публичная функция-член) |
|
вызывает
do_get
(публичная функция-член) |
Защищенные функции-члены
уничтожает объект
num_get
фасета
(защищённая функция-член) |
|
|
[virtual]
|
разбирает число из входного потока
(виртуальная защищённая функция-член) |
Пример
#include <iostream> #include <iterator> #include <locale> #include <sstream> #include <string> int main() { std::string de_double = "1.234.567,89"; std::string us_double = "1,234,567.89"; // разбор с использованием потоков std::istringstream de_in(de_double); de_in.imbue(std::locale("de_DE.UTF-8")); double f1; de_in >> f1; std::istringstream us_in(de_double); us_in.imbue(std::locale("en_US.UTF-8")); double f2; us_in >> f2; std::cout << "Parsing " << de_double << " as double gives " << std::fixed << f1 << " in de_DE locale and " << f2 << " in en_US\n"; // использование фацета напрямую std::istringstream s3(us_double); s3.imbue(std::locale("en_US.UTF-8")); auto& f = std::use_facet<std::num_get<char>>(s3.getloc()); std::istreambuf_iterator<char> beg(s3), end; double f3; std::ios::iostate err; f.get(beg, end, s3, err, f3); std::cout << "parsing " << us_double << " as double using raw en_US facet gives " << f3 << '\n'; }
Вывод:
Parsing 1.234.567,89 as double gives 1234567.890000 in de_DE locale and 1.234000 in en_US parsing 1,234,567.89 as double using raw en_US facet gives 1234567.890000
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 427 | C++98 |
num_get
гарантированно принимал любой
CharT
, который
соответствует требованиям для символа, на котором может быть инстанцирован любой из компонентов iostream |
гарантирует принятие только
char
,
wchar_t и других определяемых реализацией символьных типов |
| LWG 2392 | C++98 |
только символьный тип
CharT
мог быть
гарантированно принят
num_get
|
может гарантировать принятие определяемых
реализацией типов символьных контейнеров |
Смотрите также
|
определяет правила числовой пунктуации
(шаблон класса) |
|
|
форматирует числовые значения для вывода в виде последовательности символов
(шаблон класса) |
|
|
извлекает форматированные данные
(публичная функция-член
std::basic_istream<CharT,Traits>
)
|