为什么std :: ratio不支持比较运算符?

时间:2016-04-07 20:30:28

标签: c++ c++11

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

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

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

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>>();
}

实际上对我有用,并且可以很容易地被所有其他运营商采用

所以我错过了什么,或者有人知道为什么他们决定不支持这里的运营商?

2 个答案:

答案 0 :(得分:1)

最有可能在撰写提案N2661时回复,constexpr尚未存在。我发现constexpr的第一次出现是在N2235,所以很可能至少没有编译器实现它,并且可能甚至不确定它将在未来的标准中考虑。 这只是一个猜测,甚至可能不值得这个答案。

答案 1 :(得分:1)

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

如果你真的需要运行时对象而不是编译时类型,我建议<div class="pages"> <ul> <li class="prev"> <a href="#"><span>previous</span></a> </li> <li class="pagination-page-numbers"> <a href="#"><span>1</span></a> </li> <li class="pagination-page-numbers"> <a href="#"><span>2</span></a> </li> <li class="pagination-page-numbers on"> <a href="#"><span>3</span></a> </li> <li class="next"> <span><span>next</span></span> </li> </ul> </div> 可能不是合适的选择。