std::basic_istream
的算术提取运算符有non-virtual overloads for all 8 integer types(不列出字符,无论如何处理不同),并调用num_get::get
,其中有virtual overloads for 6 of them个字段(缺少签名版本的short和int)
std::basic_ostream
的算术插入运算符也有non-virtual overloads for all 8 integer types,它调用的num_put::put
只有virtual overloads for 4 types,long
,{{1}和他们的无符号变体。对于较小的类型,插入运算符执行整数提升。
为什么在用户可扩展性方面存在差距呢?似乎不可能为每个整数类型提供用户定义的处理(例如,在iostream接口之上构建一个类型保留的序列化库),而且它是不对称的。它可以通过很少的努力实现。是否有权衡?
答案 0 :(得分:4)
当您正在读取值时,您必须允许溢出,因此需要为每种类型提供一个提取器。当你写的值没有时,所以最大的类型就足够了。回到过去,最大的类型是long
。添加long long
后,会保留long
的版本以实现向后兼容。
答案 1 :(得分:4)
根据Standard C++ Iostreams and Locales:
乍一看,看起来好像put()的版本为short,int, 或浮动丢失。目的是保持界面 标准库简洁,类型为short或int的值可以 由long版本处理。类似地,float类型的值可以 由double的put()版本处理。
然后关于num_get::get()
:
同样,与num_put :: put()一样,这些类型并非绝对 必要的遗漏。