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) |
| (3) | ||
std::to_chars_result
to_chars( char* first, char* last, float value );
std::to_chars_result
to_chars( char* first, char* last, double value );
std::to_chars_result
to_chars( char* first, char* last, long double value ); |
(с C++17) (до C++23) | |
std::to_chars_result
to_chars( char* first, char* last, /* floating-point-type */ value );
| (с C++23) | |
| (4) | ||
std::to_chars_result
to_chars( char* first, char* last, float value,
std::chars_format fmt );
std::to_chars_result
to_chars( char* first, char* last, double value,
std::chars_format fmt );
std::to_chars_result
to_chars( char* first, char* last, long double value,
std::chars_format fmt ); |
(с C++17) (до C++23) | |
std::to_chars_result
to_chars( char* first, char* last, /* floating-point-type */ value,
std::chars_format fmt );
| (с C++23) | |
| (5) | ||
std::to_chars_result
to_chars( char* first, char* last, float value,
std::chars_format fmt, int precision );
std::to_chars_result
to_chars( char* first, char* last, double value,
std::chars_format fmt, int precision );
std::to_chars_result
to_chars( char* first, char* last, long double value,
std::chars_format fmt, int precision ); |
(с C++17) (до C++23) | |
std::to_chars_result
to_chars( char* first, char* last, /* floating-point-type */ value,
std::chars_format fmt, int precision );
| (с C++23) |
Преобразует value в строку символов, последовательно заполняя диапазон [first, last), где [first, last) должен быть валидным диапазоном.
value преобразуется в строку цифр в заданной base (без лишних ведущих нулей). Цифры в диапазоне 10..35 (включительно) представлены строчными буквами a..z. Если значение меньше нуля, представление начинается со знака минус. Библиотека предоставляет перегрузки для всех cv-неквалифицированных(с C++23) знаковых и беззнаковых целочисленных типов и для типа char в качестве типа параметра value.bool удалена. std::to_chars отклоняет аргумент типа bool потому, что результатом будет "0"/"1", но не "false"/"true", если это разрешено.value преобразуется в строку так, как если бы это делалось с помощью std::printf в локале по умолчанию ("C"). Спецификатор преобразования — f или e (предпочтение отдаётся f в случае совпадения), выбранный в соответствии с требованием к самому короткому представлению: строковое представление состоит из минимального количества символов, таких что перед десятичной точкой (если она есть) находится хотя бы одна цифра, и при парсинге представления с помощью соответствующей функции std::from_chars восстанавливается значение точно. Если таких представлений несколько, выбирается то, которое минимально отличается от value, разрешая оставшиеся конфликты с округлением в соответствии с std::round_to_nearest. Библиотека предоставляет перегрузки для всех cv-неквалифицированных типов с плавающей запятой в качестве типа параметра value.(с C++23)
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-неквалифицированных типов с плавающей запятой в качестве типа параметра value.(с C++23)
precision вместо требования к самому короткому представлению. Библиотека предоставляет перегрузки для всех cv-неквалифицированных типов с плавающей запятой в качестве типа параметра value.(с C++23)
Параметры
| 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 <array>
#include <charconv>
#include <iostream>
#include <string_view>
#include <system_error>
void show_to_chars(auto... format_args)
{
std::array<char, 10> str;
#if __cpp_lib_to_chars >= 202306L
// use C++26 operator bool() for error checking
if (auto res = std::to_chars(str.data(), str.data() + str.size(), format_args...))
std::cout << std::string_view(str.data(), res.ptr) << '\n';
else
std::cout << std::make_error_code(res.ec).message() << '\n';
#else
if (auto [ptr, ec]
= std::to_chars(str.data(), str.data() + str.size(), format_args...);
ec == std::errc())
std::cout << std::string_view(str.data(), ptr) << '\n';
else
std::cout << std::make_error_code(ec).message() << '\n';
#endif
}
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/w/cpp/utility/to_chars