是什么阻止了 std::to_chars 和 std::from_chars 的实施

What blocks implementation of std::to_chars and std::from_chars

本文关键字:chars std from to 是什么      更新时间:2023-10-16

根据 https://en.cppreference.com/w/cpp/compiler_support#cpp17 的说法,还没有主要供应商支持std::to_charsstd::from_chars的浮点版本。我知道正确格式化浮点数并非易事,但 C 库中存在实现。但是,这些都受到环境的影响,这是在标准中添加std::to_charsstd::from_chars的原因之一。那么,如果您重构 C 库以依赖于将实际转换基本转换为某种中间格式的常见低级例程,那么这些函数的实现岂不是只是免费提供的。然后std::to_charsstd::from_chars可以或多或少地直接使用结果,而C和C++中更高级的API:s(printfatofstrtodstd::stofstd::to_string(可以做一些更花哨的事情。

to/from_chars功能要求实现提供往返保证(与自身(。具体而言,必须满足以下条件:

float f = //get some float
char chars[LOTS_OF_CHARS];
auto result = to_chars(chars, chars + sizeof(chars), f);
float g;
from_chars(chars, result.ptr, g);
assert(f == g);

这种保证实际上很难实现,而且没有一个标准库 C 或 C++ 浮点到字符串到浮点数函数提供过这种保证。因此,您不能只是从printf/scanfstof/to_string中获取代码,删除语言环境的内容,并将其称为to/from_chars实现。

这是半答案,半问题:

我找到了一个关于该主题的讨论线程,其中提到了要求

字符串表示形式由最小数量的 字符,使得基数前至少有一个数字 点(如果存在(并使用 对应的 std::from_chars 函数精确地恢复值

但 C 库不支持这一点。但是,如果措辞至少是正确往返所需的字符数,那么我想

std::lock_guard l{local_mutex};
auto loc = setlocale(LC_ALL, nullptr);
setlocale(LC_ALL, "C");
char buffer[24]{};
sprintf(buffer, "%.17g", val);  // change to 9 for float
setlocale(LC_ALL, loc);

应该工作。我在这里说得对吗?