Как я могу узнать, сколько символов выделить перед вызовом std :: to_chars? - PullRequest
2 голосов
/ 23 февраля 2020

Есть несколько примеров о std::to_chars, и я нашел только пример из cppreference:

int main()
{
    std::array<char, 10> str;

    if(auto [p, ec] = std::to_chars(str.data(), str.data() + str.size(), 42);
       ec == std::errc())
        std::cout << std::string_view(str.data(), p - str.data());
}

Он жестко кодирует массив из 10 размеров, который я считаю нехорошим ... Как я мог точно знать сколько символов выделить перед вызовом std::to_chars?

float f = ...;
std::string str;
// HERE
str.resize(????);
std::to_chars(str.data(), str.data() + str.size(), f);

Ответы [ 2 ]

5 голосов
/ 23 февраля 2020

Эта функция была разработана для некоторых высокоскоростных преобразований без особых накладных расходов. Он проверит переполнение и вернет код ошибки. Однако, если вы хотите знать заранее, сколько символов приведет к конвертации, вы можете использовать

std::numeric_limits<float>::max_digits10

Так ваш код будет выглядеть так:

#include <iostream>
#include <array>
#include <charconv>

int main()
{
    std::array<char, std::numeric_limits<float>::max_digits10> str;

    float v = 1000000.0 + 1.0 / 3.0;

    if (auto [p, ec] = std::to_chars(str.data(), str.data() + str.size(), v);ec == std::errc())
        std::cout << std::string_view(str.data(), p - str.data());
}

Вы найдете дополнительная информация здесь и здесь

Обратите внимание: если вы хотите использовать std::string и его базовый буфер, то вы должны добавить 1 к std::numeric_limits<float>::max_digits10 в функция std::string resize. Однако я бы не рекомендовал использовать основной буфер std::string напрямую.

1 голос
/ 23 февраля 2020

Ну, вы можете использовать std::string, если не знаете размер:

#include <iostream>
#include <string>

int main() {
  int const i = 42;
  auto const str = std::to_string(i);
  std::cout << str;
}
...