С++ Автоматическая генерация операторов сравнения std::rel_ops

В С++ есть возможность избежать лишней работы по написанию кода некоторых операторов сравнения за счет реализации пары базовых операторов "==" и ">"

Подробнее: rel_ops - C++ Reference

Требует подключения заголовка #include <utility> и объявления using namespace std::rel_ops;

Для достижения эффекта необходимо реализовать 2 базовых оператора сравнения: "==" и ">" в итоге заимеем следующий набор:


namespace rel_ops {
  template <class T> bool operator!= (const T& x, const T& y) { return !(x==y); }
  template <class T> bool operator>  (const T& x, const T& y) { return y<x; }
  template <class T> bool operator<= (const T& x, const T& y) { return !(y<x); }
  template <class T> bool operator>= (const T& x, const T& y) { return !(x<y); }
}

Допустим у нас есть структура данных:


#include <iostream>
#include <iomanip>
#include <utility>

using namespace std;

struct Test {

    int val;
    Test(const int v): val{v} {}

    bool operator == (const Test & rhs) const {
        return val == rhs.val;
    }

    bool operator < (const Test & rhs) const {
        return val > rhs.val;
    }
};

ostream & operator << (ostream & os, const Test& rhs) {
    return os << rhs.val;
}

int main()
{
    using namespace std::rel_ops; // ОБЯЗАТЕЛЬНО!

    Test a{1}, b{3};

    // Имеем весь набор операторов
    cout << boolalpha
         << (a <  b) << endl << (a >  b) << endl
         << (a <= b) << endl << (a >= b) << endl
         << (a != b) << endl << (a == b) << endl;
}