【问题标题】:Are there any conventions for printing optional values?是否有打印可选值的约定?
【发布时间】:2011-08-09 14:43:27
【问题描述】:

假设我想为optional<T> 类模板重载operator<<。我将如何打印“缺失值”,以及如何打印“真实值”x?

none
some x

[]
[x]

或者我应该在第一种情况下不打印任何内容而在第二种情况下打印x?这通常是如何处理的?

【问题讨论】:

  • 我认为没有一般规则(这将取决于上下文)。当用于调试目的时,我会标记打印某些内容的事实(即[]none<empty>,确保不会混淆但不是空字符串)

标签: c++ string printing operator-overloading optional


【解决方案1】:

我喜欢打印NoneSome x 的选项。我认为这立即描述了正在发生的事情(尤其是对于熟悉 Haskell 的人)。

就个人而言,我不会使用[][x] 替代方案,因为许多语言使用方括号来表示某种列表。如果我看到该输出,我会立即认为已经打印了一个列表,而不是可选类型。

【讨论】:

  • C++ 程序员一般都熟悉 Haskell 吗? :)
  • @FredOverflow:可能不会,但符号仍然没有坏处。我认为有相当多的 C++ 程序员熟悉 [] 列表,所以我肯定会避免这样做。
  • 我还想指出,越来越多的程序员正在选择 F#(它也使用 Some/None 作为选项类型)。我不知道 C++/F# 交集有多大,但我确实认为在几种语言中使用 Some/None 对说明了它的用处。
  • 其实对于 Haskell 来说应该是 None/Just x(那些是 Maybe 的构造函数),@FredOverflow:有多少程序员应该熟悉函数式语言?
  • @Matthieu:好点。我忘记了 Haskell 使用 Just(我实际上更喜欢 SomeJust 读不正确,IMO)。
【解决方案2】:

在没有任何上下文的情况下,我会将可选项视为集合的一种特殊情况,它要么是空的,要么只有一个成员。

您可能已经有一个关于如何打印集合或复合对象的约定,但是如果它是空的,像 {} 或如果它的值为 x{x} 似乎是合理的。如果您将一个空向量打印为none,将一个包含三个元素的向量打印为some x y z,那么一定要将相同的约定应用于可选类型:-)

【讨论】:

    【解决方案3】:

    我不知道任何特定的约定。我个人会在缺少值时打印(null),否则打印实际值。

    【讨论】:

    • 但是你无法区分字符串"(null)"和不存在的字符串:)
    • (null)printf 的某些实现输出的空字符指针。我想不出一个不能放在输出语句中的可打印字符串;-)
    • 好吧,如果你选择 none/some 约定,那么缺失的字符串将打印为none,而字符串"none" 将打印为some none
    【解决方案4】:

    这取决于类型。如果要打印字符串,可以是“”或“Fred”。如果它是一个数组,它可以是 {} 或 { 1, 2, 3 }。

    观看此视频或网页中附加的代码可以为您提供帮助。 Pretty Printer

    【讨论】:

      【解决方案5】:

      行为的选择可能应该基于您实现输出运算符的原因。如果它主要用于调试目的,则提供缺少值的视觉线索很重要。考虑到方括号通常用于表示可选性,例如,如果缺少值,则在方括号之间或仅在左括号和右括号之间打印现有值是一种有效的方法。在命令帮助消息中。

      另一方面,如果这是一个通用输出运算符,最好的方法可能是打印现有值,就像打印非可选基础类型和空字符串一样打印缺失值。

      【讨论】:

        【解决方案6】:
        The UNIX and the Echo.
        

        UNIX 居住在新泽西州的土地上,是一位美丽的女仆,学者们不远万里慕名而来。所有人都为她的纯洁而眼花缭乱,都试图揭露她,一个是因为她的处女风度,另一个是优雅的礼貌,另一个是因为她能够灵活地执行即使在更富裕的土地上也很少完成的艰巨任务。她心胸宽广,天性随和,以至于 UNIX 采用了所有的追求者,除了那些难以忍受的富有的追求者。很快,许多子孙繁衍生息,传到地极。

        大自然对 UNIX 的回答比对其他凡人的回答更加热切。谦逊的人,对更礼貌的举止知之甚少,对她的回声感到高兴,如此精确和水晶般清晰,他们几乎不相信她会得到同样的岩石和树林的回应,这些岩石和树林在旷野中如此混乱地喊叫。顺从的 UNIX 对她被问到的问题做出了完美的回应。当一位不耐烦的小伙子问 UNIX:“无回声”时,UNIX 顺从地张开嘴,没有回声,然后又闭上了。

        “你是什么意思,”年轻人问道,​​“你就这样张开嘴?从此以后,当你应该什么都不回应的时候,永远不要开口! UNIX 有义务。

        “但我想要一场完美的表演,即使你什么都没有回应,”一个敏感的年轻人恳求道,“闭上的嘴巴也不会发出任何回应。” UNIX 不想冒犯任何一个,同意对不耐烦的年轻人和敏感的年轻人说不同的话。她把敏感的无所谓'\n'。

        然而现在当她说'\n'时,她真的没有说什么,所以她不得不张开嘴两次,一次是说'\n',一次是什么都不说,所以她没有取悦敏感的人青年,他立即说,'\n 对我来说听起来像是一个完美的虚无,但第二个毁了它。我要你收回其中一个。因此,无法忍受冒犯的 UNIX 同意撤消一些回声,并将其命名为“\c”。现在敏感的年轻人可以通过同时要求“\n”和“\c”来听到完美的回声。

        但他们说他还没听过就死于记谱过多。

        -- 道格·麦克罗伊

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-27
          • 1970-01-01
          • 2011-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-22
          • 1970-01-01
          相关资源
          最近更新 更多