#новичкам
В C++17 появилась не только функция для парсинга (std::from_chars), но и её обратная версия — std::to_chars, которая позволяет конвертировать числа (int, float, double и др.) в строки без дополнительных затрат на выделение памяти и поддержку исключений.
std::to_chars_result to_chars(char* first, char* last,
IntegerType value,
int base = 10); // (1)
std::to_chars_result to_chars(char* first, char* last,
FloatType value,
std::chars_format fmt); // (2)
std::to_chars_result to_chars(char* first, char* last,
FloatType value,
std::chars_format fmt,
int precision); // (3) (since C++23)
struct to_chars_result {
const char* ptr;
std::errc ec;
};
Единственный случай, когда эта функция может зафейлиться - если вы передали слишком маленький буффер. Тогда ec выставляется в std::errc::value_too_large, а ptr в last.
В чем преимущество функции по сравнению со старой-доброй std::to_string?
💥 Можно задать точность и основание системы счисления.
💥 Отсутствуют динамические аллокации внутри функции.
💥 Возможность использовать любые char буферы, а не только строки.
Вот вам пример работы:
char buffer[20];
int value = 12345;
auto result = std::to_chars(buffer, buffer + sizeof(buffer), value);
if (result.ec == std::errc()) {
size_t result_length = result.ptr - buffer;
std::string_view str_result(buffer, result_length);
std::cout << "Result: " << str_result << "\n"; // "12345"
}
// ------------------------
double pi = 3.1415926535;
char buf[20];
auto result = std::to_chars(buf, buf + sizeof(buf), pi, std::chars_format::fixed, 4);
if (result.ec == std::errc()) {
size_t result_length = result.ptr - buf;
std::string_view str_result(buf, result_length);
std::cout << "Result: " << str_result << "\n"; // "3.1416"
}
Не всегда проблема точности и аллокаций - это реальная проблема. Но если вы работаете с ограниченной кучей и хотите стандартное средство сериализации числа в буфер - std::to_char как раз для вас.
Be efficient. Stay cool.
#cpp17