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

pat*_*gan 19 c++ string-view c++17

我正在为应用程序的自定义选项文件编写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)
Run Code Online (Sandbox Code Playgroud)

为了处理字符串拆分和传递给函数,我使用std::string_view它是因为它避免了过多的复制并清楚地说明了查看预先存在的段的意图std::string.我已经做了所有事情,指向其中std::string_view value_str确切部分的点useful_statement包含我想要提取的值,但我无法弄清楚从a中读取a double的方法std::string_view.

我知道std::stod哪个不起作用std::string_view.它允许我写

double value = std::stod(std::string(value_str));
Run Code Online (Sandbox Code Playgroud)

然而,这很难看,因为它转换为实际上不需要的字符串,即使它可能在我的情况下没有明显的差异,如果必须从文本中读取大量的数字,它可能会太慢文件.

另一方面,atof因为我无法保证null终止符,所以不起作用.我可以通过在构造它时添加\0来破解它useful_statement,但这会使代码混淆给读者并且如果代码被更改/重构则使其容易破解.

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

Nic*_*las 19

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

double dbl;
auto result = from_chars(value_str.data(), value_str.data() + value_str.size(), dbl);
Run Code Online (Sandbox Code Playgroud)

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

  • @JeffreyBosboom `double` 版本即使在 gcc-10 中也没有实现。另一个类似“&lt;regex&gt;”的惨败。 (6认同)
  • @patatahooligan:"*我建议将呼叫改为*"这仍然无效.`back`是*last*字符.它需要是一个指针*过去*最后一个字符. (4认同)
  • @NicolBolas你甚至不需要迭代器,可以只使用`.data()`和`.data()+ .size()`就像你基本上一样. (3认同)
  • `from_chars()`需要一个`double&`而不是`double*`.这也是一个尴尬的界面......鉴于没有人提供它,也许这是一个很好的机会让它采取`string_view` ... (2认同)
  • @patatahooligan把两个论点引用一件事是值得怀疑的,称之为"普遍"更糟糕. (2认同)