Я пишу парсер С++ для настраиваемого файла параметров для приложения. У меня есть цикл, который читает строки в форме 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
при его создании, но это сделает код запутанным для читателя и сделает его слишком легко сломать, если код изменен/реорганизован.
Итак, какой был бы чистый, интуитивный и разумно эффективный способ сделать это?