【问题标题】:Implementing other comparison operators in terms of operator< in one call在一次调用中根据 operator< 实现其他比较运算符
【发布时间】:2013-08-17 14:04:52
【问题描述】:

我已经看到,如果你有operator&lt;,你可以将operator&gt;= 实现为!(a &lt; b)。但是,当我去布里斯托尔的 C++ 委员会时,他们说您可以通过这种方式实现 all 比较运算符。特别是,当考虑具有非平凡比较运算符的类型时(考虑一个任意长的字符串,特别是如果这是 Unicode),这可以通过调用operator&lt; 来完成。我无法想象这是怎么做到的。

我怎样才能实现operator&gt;operator&lt;= 只调用一次operator&lt; 而没有调用其他比较运算符?

【问题讨论】:

  • 我不确定&lt;std::rel_ops 可以用==&lt; 完成它们
  • 和你自己的例子一样:a &gt; b等于!(a == b || a &lt; b)。一键呼叫操作员<.>
  • 这也涉及对 operator== 的一次调用,这显然不如自定义运算符的性能>.
  • 正如我所说,这是对操作员的一次调用
  • @Jongware:是的。我的示例表明我想要一些对性能敏感的东西,但措辞只明确说明了 operator

标签: c++ comparison


【解决方案1】:
  • a &gt; b == b &lt; a
  • a &lt;= b == !(b &lt; a)
  • a &gt;= b == !(a &lt; b)

甚至可以用小于来实现相等(这里有点滥用我的元语法):

  • (a == b) == (!(a &lt; b) &amp;&amp; !(b &lt; a))
  • (a != b) == (a &lt; b || b &lt; a)

虽然我不建议在实践中这样做,因为它需要两次比较并且通常可以更直接地实现。

【讨论】:

  • 我看过 :-) 我删除了评论
  • 如果想像 SQL 那样实现三态逻辑,这显然是行不通的
  • +1 最后一个... (!(a
  • 这是该死的天才,但我必须指出,最后 1 是 2 调用,而不是 1
  • @KarthikT 是的 - 我把它放在最后一个主要是为了表明可能在小于方面实现相等,不一定表明这是一个好主意所以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
相关资源
最近更新 更多