Подтвердить что ты не робот

Как преобразовать std:: string_view в double?

Я пишу парсер С++ для настраиваемого файла параметров для приложения. У меня есть цикл, который читает строки в форме option=value из текстового файла, где value должен быть преобразован в double. В псевдокоде он выполняет следующие действия:

while(not EOF)
    statement <- read_from_file
    useful_statement <- remove whitespaces, comments, etc from statement
    equal_position <- find '=' in useful_statement
    option_str <- useful_statement[0:equal_position)
    value_str <- useful_statement[equal_position:end)
    find_option(option_str) <- double(value_str)

Чтобы обрабатывать разделение строк и переходить к функциям, я использую std::string_view, потому что он избегает чрезмерного копирования и четко заявляет о намерении просматривать сегменты ранее существовавшего std::string. Я сделал все до такой степени, что std::string_view value_str указывает на точную часть useful_statement, которая содержит значение, которое я хочу извлечь, но я не могу понять, как читать double с std::string_view.

Я знаю std::stod, который не работает с std::string_view. Это позволяет мне писать

double value = std::stod(std::string(value_str));

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

С другой стороны, atof не будет работать, потому что я не могу гарантировать нулевой терминатор. Я мог бы взломать его, добавив \0 в useful_statement при его создании, но это сделает код запутанным для читателя и сделает его слишком легко сломать, если код изменен/реорганизован.

Итак, какой был бы чистый, интуитивный и разумно эффективный способ сделать это?

4b9b3361

Ответ 1

Поскольку вы пометили свой вопрос с помощью С++ 1z, то это (теоретически) означает, что у вас есть доступ к from_chars. Он может обработать ваше преобразование строки в число, не требуя ничего, кроме пары const char*:

double dbl;
auto result = from_chars(value_str.data(), value_str.data() + value_str.size(), dbl);

Конечно, это требует, чтобы ваша стандартная библиотека обеспечивала реализацию from_chars.