C++ 为什么num_get和num_put是不对称的?

C++ 为什么num_get和num_put是不对称的?,c++,locale,iostream,C++,Locale,Iostream,std::basic_istream的算术提取运算符有(没有列出字符,但处理方式不同),它调用num_get::get,该运算符有单个字符(缺少short和int的有符号版本) std::basic_ostream的算术插入运算符也有,它调用num\u put::put,它只有,long,long及其无符号变体。对于较小的类型,插入运算符执行整数提升 为什么在用户可扩展性方面存在差距?似乎不可能为每个整数类型提供用户定义的处理(例如,在iostream接口上构建一个保留类型的序列化库),而且它是

std::basic_istream
的算术提取运算符有(没有列出字符,但处理方式不同),它调用
num_get::get
,该运算符有单个字符(缺少short和int的有符号版本)

std::basic_ostream
的算术插入运算符也有,它调用
num\u put::put
,它只有,
long
long
及其无符号变体。对于较小的类型,插入运算符执行整数提升


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

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

根据:

乍一看,它可能看起来像是put()的几个版本,简称int, 或者说,你失踪了。其目的是保持 标准库简明,并且可以使用short或int类型的值 由long版本处理。类似地,可以使用float类型的值 由double的put()版本处理

然后在稍后关于
num\u get::get()

同样,与num_put::put()一样,这些类型不是绝对 必要的部分省略了


但是这个问题的目的是想问为什么模块化被决定反对-例如,自定义num_put和num_get允许使用格式化输入/输出运算符的二进制I/O。@LB-:我相信这在两个答案中都得到了充分的解释。你错过了什么?当你想在<代码> NUMYPUT/<代码>中保存类型信息时,我不明白原理是如何应用的,比如二进制输出。@ LB:这根本不被认为是重要的,你可以认为这是一个缺陷,但这是另一个问题。