std::to_chars
Определён в заголовочном файле <charconv> | ||
|---|---|---|
std::to_chars_result
to_chars( char* first, char* last,
/* integer-type */ value, int base = 10 );
| (1) |
(начиная с C++17) (constexpr начиная с C++23) |
std::to_chars_result
to_chars( char*, char*, bool, int = 10 ) = delete;
| (2) | (начиная с C++17) |
std::to_chars_result
to_chars( char* first, char* last, /* floating-point-type */ value );
| (3) | (начиная с C++17) |
std::to_chars_result
to_chars( char* first, char* last, /* floating-point-type */ value,
std::chars_format fmt );
| (4) | (начиная с C++17) |
std::to_chars_result
to_chars( char* first, char* last, /* floating-point-type */ value,
std::chars_format fmt, int precision );
| (5) | (начиная с C++17) |
Преобразует value в символьную строку, последовательно заполняя диапазон [first, last), где [first, last) должен быть допустимым диапазоном.
value преобразуется в строку цифр в указанной base (без лишних ведущих нулей). Цифры в диапазоне 10..35 (включительно) представляются строчными символами a..z. Если значение меньше нуля, представление начинается со знака минус. Библиотека предоставляет перегрузки для всех целочисленных типов со знаком и без знакабез cv-квалификаторов(начиная с C++23), а также для типа char в качестве типа параметра value.std::to_chars отклоняет аргумент типа bool, поскольку в результате получилось бы "0"/"1", но не "false"/"true", если бы это было разрешено.value преобразуется в строку, как если бы использовался std::printf в локали по умолчанию ("C"). Спецификатор преобразования — f или e (при равенстве предпочтение отдаётся f); выбор определяется требованием к кратчайшему представлению: строковое представление состоит из наименьшего количества символов, при котором перед десятичной точкой (если она есть) находится хотя бы одна цифра, а разбор представления с помощью соответствующей функции std::from_chars точно восстанавливает значение. Если таких представлений несколько, выбирается то, которое имеет наименьшее отличие от value; оставшиеся равенства разрешаются округлением согласно std::round_to_nearest. Библиотека предоставляет перегрузки для всех типов с плавающей точкой без cv-квалификаторов стандартных(до C++23) в качестве типа параметра value.f, если fmt — std::chars_format::fixed, e, если fmt — std::chars_format::scientific, a (но без начального "0x" в результате), если fmt — std::chars_format::hex, и g, если fmt — chars_format::general. Библиотека предоставляет перегрузки для всех типов с плавающей точкой без cv-квалификаторов стандартных(до C++23) в качестве типа параметра value.precision, а не требованием к кратчайшему представлению. Библиотека предоставляет перегрузки для всех типов с плавающей точкой без cv-квалификаторов стандартных(до C++23) в качестве типа параметра value.Параметры
| first, last | - | символьный диапазон для записи |
| value | - | значение, которое требуется преобразовать в строковое представление |
| base | - | основание системы счисления: значение от 2 до 36 (включительно). |
| fmt | - | форматирование числа с плавающей точкой; битовая маска типа std::chars_format |
| precision | - | точность форматирования числа с плавающей точкой |
Возвращаемое значение
В случае успеха возвращает значение типа std::to_chars_result, такое что ec равно инициализированному по значению std::errc, а ptr — указателю на элемент сразу после последнего записанного символа. Обратите внимание, что строка не завершается нулевым символом.
В случае ошибки возвращает значение типа std::to_chars_result, содержащее std::errc::value_too_large в ec, копию значения last в ptr, а содержимое диапазона [first, last) остаётся в неуказанном состоянии.
Исключения
Ничего не выбрасывает.
Примечания
В отличие от других функций форматирования в библиотеках C++ и C, std::to_chars не зависит от локали, не выделяет память и не выбрасывает исключений. Предоставляется лишь небольшое подмножество политик форматирования, используемых другими библиотеками (например, std::sprintf). Это позволяет реализовать максимально быструю функцию, полезную в распространённых сценариях с высокой пропускной способностью, таких как текстовый обмен данными (JSON или XML).
Гарантия того, что std::from_chars сможет точно восстановить любое значение с плавающей точкой, отформатированное с помощью std::to_chars, действует только в том случае, если обе функции взяты из одной и той же реализации.
Чтобы отформатировать значение bool как "0"/"1", его необходимо явно привести к другому целочисленному типу.
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_to_chars | 201611L | (C++17) | Базовые преобразования строк (std::to_chars, std::from_chars) |
202306L | (C++26) | Проверка успешного выполнения или ошибки функций <charconv> |
|
__cpp_lib_constexpr_charconv | 202207L | (C++23) | Добавление модификаторов constexpr к перегрузкам std::to_chars и std::from_chars (1) для целочисленных типов |
Пример
#include <charconv>
#include <iomanip>
#include <iostream>
#include <string_view>
#include <system_error>
void show_to_chars(auto... format_args)
{
const size_t buf_size = 10;
char buf[buf_size]{};
std::to_chars_result result = std::to_chars(buf, buf + buf_size, format_args...);
if (result.ec != std::errc())
std::cout << std::make_error_code(result.ec).message() << '\n';
else
{
std::string_view str(buf, result.ptr - buf);
std::cout << std::quoted(str) << '\n';
}
}
int main()
{
show_to_chars(42);
show_to_chars(+3.14159F);
show_to_chars(-3.14159, std::chars_format::fixed);
show_to_chars(-3.14159, std::chars_format::scientific, 3);
show_to_chars(3.1415926535, std::chars_format::fixed, 10);
}
Возможный вывод:
"42" "3.14159" "-3.14159" "-3.142e+00" Value too large for defined data type
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Исправленное поведение |
|---|---|---|---|
| LWG 2955 | C++17 | эта функция находилась в <utility> и использовала std::error_code | перемещена в <charconv> и использует std::errc |
| LWG 3266 | C++17 | Аргумент bool принимался и повышался до типа int | отклоняется удалённой перегрузкой |
| LWG 3373 | C++17 |
std::to_chars_result мог иметь дополнительные члены | дополнительные члены запрещены |
См. также
|
(C++17) | тип возвращаемого значения std::to_chars (класс) |
|
(C++17) | преобразует последовательность символов в целое число или число с плавающей точкой (функция) |
|
(C++11) | преобразует целое число или число с плавающей точкой в string (функция) |
|
(C++11) | выводит форматированные данные в stdout, файловый поток или буфер (функция) |
| вставляет форматированные данные (открытая функция-член std::basic_ostream<CharT,Traits>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/to_chars