【问题标题】:Why does std::ratio not support comparison operators?为什么 std::ratio 不支持比较运算符?
【发布时间】:2016-04-07 20:30:28
【问题描述】:

由于 C++ 标准库通常为其类提供重载运算符,我想知道为什么有比较函数(实际上不是真正的函数,而是具有重载 () 运算符的结构)但 std::ratio 类没有比较运算符(埃斯)。

我认为它们会提供更好的使用和可读性,并且也可以在编译时执行。

即使他们的特定解决方案需要使用结构进行模板元编程,将其包装到另一个类似的函数中应该没问题:

template<intmax_t N1, intmax_t D1, intmax_t N2, intmax_t D2>
constexpr bool operator==(const ratio<N1, D1>& first, const ratio<N2, D2>& second) {
    return ratio_equal<ratio<N1,D1>, ratio<N2,D2>>();
}

实际上对我有用,也可以很容易地被所有其他操作员采用

那么我是否遗漏了什么,或者有人知道他们为什么决定不在这里支持运营商?

【问题讨论】:

  • 您多久使用比率作为对象而不是模板参数?
  • 其实这是一个很好的观点,但仍然不是不实现上述功能的原因。
  • 保持比率的准确性以进行比较需要分子和分母的交叉乘法,这可能会悄悄地溢出正在使用的 int 类型。
  • 是的,但提供的函数也可能发生这种情况(实际上它们是我知道的带有重载 () 运算符的结构),不是吗?并且包装提供的任何解决方案都不应该改变行为。

标签: c++ c++11


【解决方案1】:

ratio 类不是为实例化而设计的;它没有数据成员,因此基于它的任何对象都不包含类类型本身之外的任何信息。由于必须针对对象而不是类型调用运算符,因此提供它们毫无意义。这甚至会适得其反,因为这意味着实例化类会很有用。

如果您确实需要运行时对象而不是编译时类型,我建议ratio 可能不是合适的选择。

【讨论】:

  • 我不得不同意,这可能是最重要的原因之一(正如巴里所说)。但他们确实有成员(他们是静态的,但是......),请参阅en.cppreference.com/w/cpp/numeric/ratio/ratio
  • @mr.green 静态成员不属于对象,它们属于类本身。该类类型的对象将为空,尽管标准要求它至少占用一个字节。
  • 这就是我写的(或“它们是静态的......”的意思),但我认为我们只是在谈论彼此
  • @mr.green 那么你不同意我的推理吗?运算符只能处理对象,并且该类不打算创建对象。因此没有运营商。
  • 是的,这是我昨天甚至前天考虑时错过的主要事情,具体取决于时区。
【解决方案2】:

很可能在编写提案N2661 时,constexpr 还不存在。我发现 constexpr 的第一次出现是在N2235 中,所以至少没有编译器实现了它,甚至可能不确定它是否会在未来的标准中被考虑。 这只是一个猜测,也许甚至不值得这个答案。

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2015-09-26
    • 2021-11-19
    相关资源
    最近更新 更多