为什么num_get和num_put不对称

Why are num_get and num_put asymmetric?

本文关键字:num 不对称 put get 为什么      更新时间:2023-10-16

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

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

为什么在用户可扩展性的其他方面存在差距?为每个整数类型提供用户定义的处理似乎是不可能的(例如,在iostream接口之上构建一个保持类型的序列化库),而且,它是不对称的。这本来不费什么力气就能做到的。这是一种权衡吗?

根据标准c++ Iostreams和locale:

乍一看,它似乎是put()的版本,简称为int,或者浮子都不见了。这样做的目的是为了保持标准库简洁,short或int类型的值可以是由long的版本处理。类似地,float类型的值可以由double的put()版本处理。

然后是关于num_get::get():

同样,与num_put::put()一样,这些类型不是绝对的

读取值时必须考虑到溢出,因此需要为每种类型提供一个提取器。当你写值的时候,你不需要,所以最大的类型就足够了。在过去,最大的字体是long。当long long被添加时,为了向后兼容,long的版本被保留。