我正在为应用程序的自定义选项文件编写 C++ 解析器。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
to来破解它useful_statement
,但这会使代码对读者感到困惑,并且如果代码被更改/重构,它也很容易被破坏。
那么,什么是干净、直观和合理有效的方法呢?