std::setbase说:
除8、10或16以外的基值将基场重置为零,这对应于十进制输出和前缀依赖的输入。
怎么会这样?
是否有特别的理由只支持这些基地?至少支持16 (实际上,36: 0-9,然后是at ),而不必做出任何困难的选择,这似乎是微不足道的。具体来说,2是一个流行的基础,我认为应该对std::setbase(2) (和相应的std::binary)感兴趣。
我显然可以打印我自己的部分,但如果我的ostream能这样做的话,那就太好了。
发布于 2016-04-28 13:04:38
唯一确定的答案是“因为标准是这么说的”。
话虽如此,该标准大多正式化了预先标准的iostream实现,其中许多实现可能只是为了达到与printf的功能平价,后者只支持十进制、八进制和十六进制(通过ad,而不是真正的通用语法)。
而且,现在看来,修补iostream API以支持“多”基并不容易,因为基础设置最终进入位字段,而不是在单独的“当前基”字段中。
现在,标准要求fmtflags必须是某种“位掩码类型”--甚至可能是一个std::bitset,因此您可能会找到一种方法,以某种方式铲掉所有这些新的“基本”字段--但是,对于几乎没有人真正关心的特性(加上破坏假定fmtflags是一种完整类型的代码的风险),它真的值得吗?
因此,总结一下:糟糕的初始设计(实际上就像iostream的其余部分)、不平凡的修复以及用户对这样一个特性的实际需求。
发布于 2021-05-19 22:33:39
据我所知,没有人建议在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的作者。
https://stackoverflow.com/questions/36702896
复制相似问题