Если клиентский код взаимодействует, вы можете удалить логические операции, используя std :: rel_ops . rel_ops
определяет группу логических операторов в терминах ваших == и <операторов. </p>
Однако это проблематично - это заставляет клиента использовать rel_ops, а rel_ops неожиданно позволяет любому классу с оператором == и <сравниваться со всеми другими операторами. Это, вероятно, не то, что вы хотите. </p>
IMO, лучший вариант - использовать библиотеку boost операторов , которая кажется идеальной для числовых типов, поскольку она предоставляет все различные операторы, которые вы могли бы хотеть для числового типа. Вы просто определяете несколько базовых операторов, а остальные заполняют в зависимости от вашей спецификации. Чтобы украсть из примера документации буста:
template <class T>
class point // note: private inheritance is OK here!
: boost::addable< point<T> // point + point
, boost::subtractable< point<T> // point - point
, boost::dividable2< point<T>, T // point / T
, boost::multipliable2< point<T>, T // point * T, T * point
> > > >
{
public:
point(T, T);
T x() const;
T y() const;
point operator+=(const point&);
// point operator+(point, const point&) automatically
// generated by addable.
point operator-=(const point&);
// point operator-(point, const point&) automatically
// generated by subtractable.
point operator*=(T);
// point operator*(point, const T&) and
// point operator*(const T&, point) auto-generated
// by multipliable.
point operator/=(T);
// point operator/(point, const T&) auto-generated
// by dividable.
private:
T x_;
T y_;
};