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

问题描述 投票:6回答:1

The cppreference page on std::setbase说:

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

怎么会?

有没有特别的理由为什么只支持这些基地?至少支持16到16(实际上,高达36:0-9,然后是a-z)的任何东西似乎微不足道,而不必做出任何困难的选择。具体来说,2是一个受欢迎的基础,我认为应该有std::setbase(2)(和相应的std::binary)的兴趣。

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

c++ base ostream c++-standard-library iomanip
1个回答
6
投票

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

话虽这么说,标准大多形式化了预标准的iostream实现,其中许多可能只是为了达到与printf的功能奇偶校验,fmtflags只支持十进制,八进制和十六进制(通过ad-hoc,非真正的一般语法) 。

此外,由于基本设置最终会进入位域,而不是单独的“当前基础”字段,因此现在修补iostream API以支持“很多”基数并不是一件容易的事。

现在,该标准要求std::bitset具有一些“bitmask类型” - 甚至可能是fmtflags,所以你可能会找到一种方法来铲除所有这些新的“基础”字段 - 但这是否值得努力(加上风险)打破代码,假设qazxswpoi是一个整体类型)几乎没有人真正关心的功能?

总而言之:糟糕的初始设计(实际上是iostream的其余部分),非常重要的修复,并没有真正的用户对此类功能的需求。

© www.soinside.com 2019 - 2024. All rights reserved.