为什么std::ratio不支持比较运算符
Why does std::ratio not support comparison operators?
由于C++标准库通常为其类提供重载运算符,我想知道为什么有比较函数(实际上不是真正的函数,而是带有重载()运算符的结构),但没有std::ratio类的比较运算符。
我认为它们将提供更好的使用性和可读性,并且可以在编译时执行。
即使他们的特定解决方案需要使用structs进行模板元编程,也可以将其封装到另一个类似的函数中:
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>>();
}
实际上对我有效,可以很容易地为所有其他运营商采用
那么,我是不是错过了什么,或者有人知道他们为什么决定不支持这里的运营商吗?
很可能在编写N2661提案时,constexpr还不存在。我发现constexpr的第一次出现是在N2235中,所以很可能至少没有编译器实现它,甚至可能不确定它会在未来的标准中被考虑。这只是一个猜测,也许甚至不值得这个答案。
ratio
类不是为实例化而设计的;它没有数据成员,因此基于它的任何对象都不包含类类型本身之外的任何信息。由于运算符必须针对对象而不是类型调用,因此提供它们是毫无意义的。这甚至会适得其反,因为这意味着实例化类会很有用。
如果您确实需要运行时对象而不是编译时类型,我建议ratio
可能不是合适的选择。
相关文章:
- 为什么比较运算符如此快速
- 布尔比较运算符是如何在C++中工作的
- 关于 std::min, std::max 中的比较运算符的混淆
- 三向比较运算符成员与非成员实现
- 标准::可选枚举的比较运算符
- C++分数混合比较运算符错误
- 不能将重载比较运算符与 Catch 测试一起使用
- 重构使用动态强制转换的 std::set 的比较运算符
- 为什么我的比较运算符不比较我的点长和双精度值?
- 高效简单的结构比较运算符
- 如何实现 Boost.Hana 结构的相等比较运算符?
- 为什么sub_match和basic_string比较运算符使用额外的字符串副本实现?
- 是否可以在C++中使用三元运算符在 if 语句中选择比较运算符?
- 在priority_queue的自定义类中重载比较运算符
- 为什么C++容器之间存在比较运算符
- 尝试使用比较运算符对对象向量进行排序
- C++复合逻辑运算符不使用比较运算符
- C++:比较运算符>和字符串文本的意外结果
- 重载对象成员的比较运算符
- 比较运算符==中的对象指针