【问题标题】:Why are num_get and num_put asymmetric?为什么 num_get 和 num_put 不对称?
【发布时间】:2013-04-09 17:44:08
【问题描述】:

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,即longlong long 及其无符号变体。对于较小的类型,插入运算符执行整数提升。

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

【问题讨论】:

    标签: c++ locale iostream


    【解决方案1】:

    根据Standard C++ Iostreams and Locales

    乍一看,它可能看起来像是 put() 的缩写,int, 或浮动丢失。目的是保持界面 标准库简洁,可以是 short 或 int 类型的值 由long的版本处理。类似地,浮点类型的值可以 由 double 的 put() 版本处理。

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

    同样,与 num_put::put() 一样,不是绝对的类型 必要的被省略了。

    【讨论】:

    • 但问题的目的是询问为什么决定反对模块化 - 例如自定义 num_put 和 num_get 允许使用格式化的输入/输出运算符进行二进制 I/O。
    • @LB--:我相信这在两个答案中都得到了充分的解释。你错过了什么?
    • 当人们想要在 num_put 中保留类型信息时,我不明白这个基本原理是如何适用的,例如二进制输出。
    • @LB--:这根本不重要,您可以将其视为缺陷,但这是另一个问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-21
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2012-07-20
      • 2011-11-21
      相关资源
      最近更新 更多