将 "operator>" 委托给 "operator<" 是一种错误的形式吗?
Is it bad form to have "operator>" delegate to "operator<"?
我在最近的一个程序中写过这个:
friend bool operator<(const MyClass& a, const MyClass& b) {
// Lots of comparison code here
}
friend bool operator>(const MyClass& a, const MyClass& b) {
return b < a;
}
当我 运行 程序时它工作正常,但这是错误的形式吗?有什么理由我不应该这样做吗?或者有什么我应该做的吗?
通常我会把operator<
和operator>
完全分开写,但是因为operator<
中的代码很长,所以我决定走这条捷径。
另请注意,速度在此程序中至关重要。
用小于号定义比较运算符是很常见的,以避免一遍又一遍(或copy/pasting)编写相同的代码,这是错误的来源:
bool operator<(const Foo& a, const Foo& b) {
//Actual comparison of members
}
bool operator>=(const Foo& a, const Foo& b) {
return !(a < b);
}
bool operator>(const Foo& a, const Foo& b) {
return b < a;
}
bool operator<=(const Foo& a, const Foo& b) {
return !(b < a); //Can also do !(a > b)
}
问题来了,相等可以用小于来定义,但如果你需要严格的弱排序,它意味着不同于显式相等的东西:
bool operator==(const Foo& a, const Foo& b) {
return !(a < b) && !(b < a);
}
bool operator!=(const Foo& a, const Foo& b) {
return !(a == b);
}
或
bool operator==(const Foo& a, const Foo& b) {
//Actual comparison of members.
}
bool operator!=(const Foo& a, const Foo& b) {
return !(a == b);
}
我在最近的一个程序中写过这个:
friend bool operator<(const MyClass& a, const MyClass& b) {
// Lots of comparison code here
}
friend bool operator>(const MyClass& a, const MyClass& b) {
return b < a;
}
当我 运行 程序时它工作正常,但这是错误的形式吗?有什么理由我不应该这样做吗?或者有什么我应该做的吗?
通常我会把operator<
和operator>
完全分开写,但是因为operator<
中的代码很长,所以我决定走这条捷径。
另请注意,速度在此程序中至关重要。
用小于号定义比较运算符是很常见的,以避免一遍又一遍(或copy/pasting)编写相同的代码,这是错误的来源:
bool operator<(const Foo& a, const Foo& b) {
//Actual comparison of members
}
bool operator>=(const Foo& a, const Foo& b) {
return !(a < b);
}
bool operator>(const Foo& a, const Foo& b) {
return b < a;
}
bool operator<=(const Foo& a, const Foo& b) {
return !(b < a); //Can also do !(a > b)
}
问题来了,相等可以用小于来定义,但如果你需要严格的弱排序,它意味着不同于显式相等的东西:
bool operator==(const Foo& a, const Foo& b) {
return !(a < b) && !(b < a);
}
bool operator!=(const Foo& a, const Foo& b) {
return !(a == b);
}
或
bool operator==(const Foo& a, const Foo& b) {
//Actual comparison of members.
}
bool operator!=(const Foo& a, const Foo& b) {
return !(a == b);
}