继承EqualityComparable可以得到其大部分运算符
template<typename Derived>
class EqualityComparable {
public:
friend bool operator==(Derived const &x1, Derived const &x2) {
return !(x1 < x2) && !(x2 < x1);
}
friend bool operator!=(Derived const &x1, Derived const &x2) {
return !(x1 == x2);
}
friend bool operator>(Derived const &x1, Derived const &x2) {
return x2 < x1;
}
friend bool operator>=(Derived const &x1, Derived const &x2) {
return !(x1 < x2);
}
friend bool operator<=(Derived const &x1, Derived const &x2) {
return !(x1 > x2);
}
};
class YearBonus : public EqualityComparable<YearBonus> {
private:
int base;
double rate;
double real() const {
return base * rate;
}
public:
explicit YearBonus(int base = 1, double rate = 0) : base(base), rate(rate) {}
friend bool operator<(YearBonus const &lhs, YearBonus const &rhs) {
return lhs.real() < rhs.real();
}
};
int main() {
YearBonus my(1000, 0.75);
YearBonus you(10000, 0.075);
cout << (my <= you) << endl;
}