如何将std :: string_view转换为double?

patatahooligan

我正在为应用程序的自定义选项文件编写C ++解析器。我有一个循环,该循环option=valuevalue必须转换为的文本文件中读取形式的行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包含我想提取物的价值,但我想不出读取的方式doublestd::string_view

我知道std::stod哪一个不适用于std::string_view它可以让我写

double value = std::stod(std::string(value_str));

但是,这很丑陋,因为它会转换为实际上不需要的字符串,即使在我看来,它不会产生明显的变化,但是如果必须从文本中读取大量数字,它可能会太慢文件。

另一方面,atof由于我不能保证为空终止符,因此无法使用。我可以通过在构造时添加\0useful_statement对其进行修改,但这会使代码使读者感到困惑,并且如果代码被更改/重构,则很容易被破坏。

那么,什么是一种干净,直观且合理有效的方法呢?

尼科尔·波拉斯(Nicol Bolas)

由于您使用C ++ 1z标记了问题,因此(理论上)意味着您可以访问from_chars它可以处理您的字符串到数字的转换,而不需要一对const char*s:

double dbl;
auto result = from_chars(value_str.data(), value_str.data() + value_str.size(), dbl);

当然,这需要您的标准库提供的实现from_chars

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章