我正在为一个应用程序编写一个自定义选项文件的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
的确切部分的那个点,但我无法弄清如何从std :: string_view
读取一个double
。
我知道std::stod
,但它不适用于std::string_view
。它让我写
double value = std::stod(std::string(value_str));
然而,这种方法很丑陋,因为它转换成一个实际上并不需要的字符串,尽管在我的情况下可能不会产生明显的影响,但如果需要从文本文件中读取大量数字,则可能太慢了。另一方面,
atof
是行不通的,因为我不能保证空终止符。我可以通过在构造useful_statement
时添加\0
来进行修改,但这会使代码对读者来说难以理解,并且使其在修改/重构代码时容易出错。那么,有什么干净、直观且相当高效的方法可以做到这一点呢?
boost::convert<double>(stringview);
来完成这个任务。我在这里找到了它...页面上的最后一条评论 https://github.com/boostorg/convert/issues/29 - Millie Smithboost::convert<double>(stringview, stringview.length())
,这样做肯定比转换为字符串更简洁,而且希望速度更快。唯一的缺点是需要额外依赖于 boost。 - patatahooliganwhile (!stream.eof())
有一些麻烦的问题。 - user4581301while ( stream << statement )
的语句。 - Arne Vogelboost::convert
的修复支持std::string_view
是将范围复制到数组并添加 NUL 终止符:https://github.com/boostorg/convert/commit/ab1a43676e04a7c73602e6d1cb2337ea5402c4df - Andreas Magnusson