但是,我担心的是,为什么需要两个单独的定义?
您不必同时定义两者。
如果它们是互斥的,那么您仍然可以通过仅定义std :: rel_ops==
并<
与之保持简洁关系
Fom cppreference:
#include <iostream>
#include <utility>
struct Foo {
int n;
};
bool operator==(const Foo& lhs, const Foo& rhs)
{
return lhs.n == rhs.n;
}
bool operator<(const Foo& lhs, const Foo& rhs)
{
return lhs.n < rhs.n;
}
int main()
{
Foo f1 = {1};
Foo f2 = {2};
using namespace std::rel_ops;
//all work as you would expect
std::cout << "not equal: : " << (f1 != f2) << '\n';
std::cout << "greater: : " << (f1 > f2) << '\n';
std::cout << "less equal: : " << (f1 <= f2) << '\n';
std::cout << "greater equal: : " << (f1 >= f2) << '\n';
}
是否有可能问到关于两个对象相等的问题是有意义的,而问他们不相等是没有意义的呢?
我们经常将这些运算符与平等联系在一起。
尽管这是它们在基本类型上的行为,但没有义务将其作为自定义数据类型的行为。如果您不想这样做,甚至不需要退还布尔值。
我见过人们以奇怪的方式重载运算符,却发现这对于他们的特定于域的应用有意义。即使界面似乎表明它们是互斥的,作者也可能想添加特定的内部逻辑。
(从用户角度或从实施者角度)
我知道您想要一个特定的示例,
因此这是我认为实用的Catch测试框架中的一个示例:
template<typename RhsT>
ResultBuilder& operator == ( RhsT const& rhs ) {
return captureExpression<Internal::IsEqualTo>( rhs );
}
template<typename RhsT>
ResultBuilder& operator != ( RhsT const& rhs ) {
return captureExpression<Internal::IsNotEqualTo>( rhs );
}
这些运算符在做不同的事情,将一个方法定义为另一种方法(不是)是没有意义的。这样做的原因是为了使框架可以打印出进行的比较。为此,它需要捕获所使用的重载运算符的上下文。