我正在为应用程序的自定义选项文件编写C++解析器。我有一个循环,以文本文件的形式从option=value
中读取行,其中value
必须转换为double
。在伪代码将执行以下操作:如何将std :: string_view转换为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
的确切部分,其中包含我想要提取的值,但我无法弄清楚从std::string_view
读取double
的方法。
我知道std::stod
哪个不能与std::string_view
一起使用。这让我写
double value = std::stod(std::string(value_str));
然而,这是丑陋的,因为它转化为实际不需要一个字符串,即使它可能不会在我的情况下,一个明显的区别,它可能是,如果速度太慢必须从文本文件中读取大量的数字。
另一方面,atof
将无法正常工作,因为我无法保证空终止符。当构建它时,我可以通过将\0
添加到useful_statement
来破解它,但是如果代码被更改/重构,这会使代码对读者感到困惑,并且使代码变得容易中断。
那么,干净,直观和合理有效的方法是什么?
你确定使用boost吗?我认为你可以用'boost :: convert(stringview);'做到这一点。我从这里得到了...在页面上最后的评论https://github.com/boostorg/convert/issues/29 –
很好的发现。尽管如此,它可能是'boost :: convert(stringview,stringview.length())'。它肯定比转换为字符串更清晰,希望更快。唯一的缺点是增加了一个额外的依赖。 –
patatahooligan
偏题:显然这是psuedocode,但要注意如何实现“while(not EOF)”。简单的'while(!stream.eof())'有一些令人讨厌的陷阱。 – user4581301