是什么阻止了 std::to_chars 和 std::from_chars 的实施
What blocks implementation of std::to_chars and std::from_chars
根据 https://en.cppreference.com/w/cpp/compiler_support#cpp17 的说法,还没有主要供应商支持std::to_chars
和std::from_chars
的浮点版本。我知道正确格式化浮点数并非易事,但 C 库中存在实现。但是,这些都受到环境的影响,这是在标准中添加std::to_chars
和std::from_chars
的原因之一。那么,如果您重构 C 库以依赖于将实际转换基本转换为某种中间格式的常见低级例程,那么这些函数的实现岂不是只是免费提供的。然后std::to_chars
和std::from_chars
可以或多或少地直接使用结果,而C和C++中更高级的API:s(printf
,atof
,strtod
,std::stof
,std::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/scanf
或stof/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);
应该工作。我在这里说得对吗?
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选