为什么 std::setbase(2) 不切换到二进制输出?

Why doesn't std::setbase(2) switch to binary output?

本文关键字:二进制 输出 setbase std 为什么      更新时间:2023-10-16

std::setbase上的cpp首选项页面说:

8、10 或 16 以外的基数值将基数字段重置为零,这对应于十进制输出和前缀相关输入。

怎么来了?

是否有特殊原因仅支持这些基础?至少支持最多 16 个(实际上,最多 36:0-9 然后是 a-z(而不必做出任何困难的选择似乎微不足道。具体来说,2 是一个流行的基础,我认为应该对std::setbase(2)感兴趣(以及相应的std::binary(。

我显然可以打印自己的位,但对我的 ostream 来说这样做会很好。

唯一确定的答案是"因为标准是这样说的"。

话虽如此,该标准主要形式化了预标准的iostream实现,其中许多可能只是为了达到与printf的功能奇偶校验,后者仅支持十进制,八进制和十六进制(通过临时的,不是真正的通用语法(。

此外,就像现在一样,修补iostream API以支持"许多"碱基并不是一件容易的事,因为基设置最终会进入位域,而不是在单独的"当前碱基"字段中。

现在,该标准要求fmtflags是某种"位掩码类型"——甚至可能是一个std::bitset,所以你可能会找到一种方法来以某种方式铲除所有这些新的"基本"字段——但它真的值得为一个几乎没有人真正关心的功能付出努力(加上破坏假设fmtflags是整体类型的代码的风险(吗?

所以,总结一下:糟糕的初始设计(实际上就像iostream的其余部分一样(,不平凡的修复以及没有真正的用户对这种功能的需求。

据我所知,没有提议向iostreams添加对二进制(基数2(格式的支持(另请参阅是否有将std::bin添加到c ++标准的提案?(。但是,它在 C++20 std::format中受支持:

std::string s = std::format("{:b}", 42);

std::format不是广泛使用的,但您可以使用 {fmt} 库,std::format同时基于:

std::string s = fmt::format("{:b}", 42);

免责声明:我是 {fmt} 和 C++20 std::format 的作者。