7

上的 cppreference 页面std::setbase说:

非 8、10 或 16 的基值会将基域重置为零,这对应于十进制输出和依赖于前缀的输入。

怎么来的?

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

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

4

2 回答 2

7

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

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

此外,鉴于基础设置最终进入位域,而不是单独的“当前基”字段,因此修补 iostream API 以支持“许多”基础也不是一件容易的事。

现在,该标准要求fmtflags是某种“位掩码类型”——甚至可能是std::bitset一个假设它fmtflags是整数类型的代码)对于几乎没有人真正关心的功能?

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

于 2016-04-28T13:04:38.260 回答
3

据我所知,没有提议向 iostreams 添加对二进制(base 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

于 2021-05-19T22:33:39.613 回答