Я пишу анализатор С++ для пользовательского файла параметров для приложения. У меня есть цикл, который читает строки в виде 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
при его построении, но это сделает код запутанным для читателя и сделает его слишком легким для взлома, если код будет изменен/рефакторинг.
Итак, что было бы чистым, интуитивно понятным и достаточно эффективным способом сделать это?
boost::convert<double>(stringview);
. Я взял это отсюда... последний комментарий на странице github.com/boostorg/convert/ вопросы/29 - person Millie Smith   schedule 11.08.2017boost::convert<double>(stringview, stringview.length())
. Это, безусловно, чище, чем преобразование в строку, и, надеюсь, быстрее. Единственным недостатком является дополнительная зависимость от повышения. - person patatahooligan   schedule 11.08.2017while (!stream.eof())
имеет несколько неприятных ошибок. - person user4581301   schedule 11.08.2017while ( stream << statement )
… - person Arne Vogel   schedule 14.08.2017boost::convert
для поддержкиstd::string_view
состоит в том, чтобы скопировать диапазон в массив и завершить NUL: ">github.com/boostorg/convert/commit/ - person Andreas Magnusson   schedule 08.01.2021