为什么num_get和num_put不对称?

8

std::basic_istream的算术提取运算符有8种整数类型的非虚拟重载(不列出字符,因为它们被单独处理),它调用num_get::get,该函数有6种虚拟重载(缺少short和int的有符号版本)。

std::basic_ostream的算术插入运算符也有8种整数类型的非虚拟重载,它调用num_put::put,该函数只有4种虚拟重载,即longlong long及其无符号版本。对于较小的类型,插入运算符执行整数提升。

为什么在用户可扩展性的杰作中出现了一个差距?似乎不可能为每种整数类型提供用户定义的处理方式(例如,在iostream接口之上构建一个类型保留序列化库),而且更不对称。这可以通过很小的努力实现。这是一种权衡吗?
2个回答

4

当您读取值时,必须考虑到溢出情况,因此需要为每种类型创建一个提取器。当您写入值时,则不需要,因此最大类型就足够了。在旧时代,最大类型是long。添加long long后,long的版本保留了向后兼容性。


4
根据《标准C++ Iostreams和Locales》所述,乍一看可能会发现short、int或float类型的put()版本缺失。其目的在于保持标准库接口简洁,可以通过使用long版本处理short或int类型的值。同样,double版本的put()可以处理float类型的值。
关于num_get::get()的内容,同样地,像num_put::put()一样,省略了不必要的类型。

但问题的意图是询问为什么放弃了模块化 - 例如自定义num_put和num_get,允许使用格式化输入/输出运算符进行二进制I/O。 - LB--
@LB--:我相信这两个答案已经充分解释了。你错过了什么? - Jesse Good
我不明白有理论支持的情况下如何在num_put中保留类型信息(例如用于二进制输出)。 - LB--
@LB--:那只是没有被考虑到的重要性,你可以把它看作是一个缺陷,但那是另一个问题。 - Jesse Good

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接