8

算术提取运算符对所有 8 种整数类型std::basic_istream都有非虚拟重载(不列出字符,无论如何处理方式不同),它调用num_get::get,其中有 6 个有单独的虚拟重载(缺少 short 和 int 的有符号版本)

算术插入运算符对于所有 8 种整数类型std::basic_ostream也有非虚拟重载,它调用num_put::put,它只对 4 种类型有虚拟重载,它们是longlong long以及它们的无符号变体。对于较小的类型,插入运算符执行整数提升。

为什么在用户可扩展性方面存在差距?似乎不可能为每个整数类型提供用户定义的处理(例如,在 iostream 接口之上构建一个类型保留的序列化库),而且它是不对称的。不费吹灰之力就可以实现。有取舍吗?

4

2 回答 2

4

当您读取值时,您必须允许溢出,因此每种类型都需要一个提取器。当您编写值时,您不会,因此最大的类型就足够了。在过去,最大的类型是long. 添加long long后,long为向后兼容保留了 for 的版本。

于 2013-04-09T18:05:09.230 回答
4

根据标准 C++ Iostreams 和 Locales

乍一看,它可能看起来好像缺少用于 short、int 或 float 的 put() 版本。目的是保持标准库的接口简洁,long 版本可以处理 short 或 int 类型的值。类似地,float 类型的值可以由 double 的 put() 版本处理。

然后是关于num_get::get()

同样,与 num_put::put() 一样,省略了非绝对必要的类型。

于 2013-04-09T18:14:08.080 回答