为什么num_get和num_put不对称?

时间:2013-04-09 17:44:09

标签: c++ locale iostream

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 typeslong,{{1}和他们的无符号变体。对于较小的类型,插入运算符执行整数提升。

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

2 个答案:

答案 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()一样,这些类型并非绝对   必要的遗漏。