Автоматически создать операторы отношений/сравнений
От: Marty Пират  
Дата: 07.05.20 04:37
Оценка:
Здравствуйте!

Есть у меня структура. Сделал я для неё метод (можно и свободную функцию) compare, которая возвращает int. Можно как-то сформировать операторы всей пачкой на базе этого метода? Ну, <, <=, >, >=, ==, !=, чтобы ручками не выписывать?
Вам как-бы показали сцыкливое мурло российской оппозиции — вот оно
Автор: Министр Промышленности
Дата: 17.10.19
!
Re: Автоматически создать операторы отношений/сравнений
От: watchmaker  
Дата: 07.05.20 05:31
Оценка: 8 (1) +2
Здравствуйте, Marty, Вы писали:

M>Есть у меня структура. Сделал я для неё метод (можно и свободную функцию) compare, которая возвращает int. Можно как-то сформировать операторы всей пачкой на базе этого метода? Ну, <, <=, >, >=, ==, !=, чтобы ручками не выписывать?


Можно: https://en.cppreference.com/w/cpp/language/default_comparisons
Re: Автоматически создать операторы отношений/сравнений
От: PM  
Дата: 07.05.20 05:45
Оценка: 8 (1) +1
Здравствуйте, Marty, Вы писали:

M> Здравствуйте!


M>Есть у меня структура. Сделал я для неё метод (можно и свободную функцию) compare, которая возвращает int. Можно как-то сформировать операторы всей пачкой на базе этого метода? Ну, <, <=, >, >=, ==, !=, чтобы ручками не выписывать?


В C++20 сказать компилятору, чтобы он сгенерировал spaceship operator:
struct A
{
   int a;
   std::string b;

   auto operator<=>(A const&) const = default;
};

bool r = A{ 2, "b" } > A{ 1, "a" };


В С++[11..17] есть namespace std::rel_ops которому нужны operator< и operator==:
struct B
{
   int x;
   std::string y;
   bool operator==(B const& b) const { return std::tie(x, y) == std::tie(b.x, b.y); } 
   bool operator< (B const& b) const { return std::tie(x, y) <  std::tie(b.x, b.y); }
};

using namespace std::rel_ops;
bool r =  B{ 2, "b" } > B{ 1, "a" };


В Boost operators есть `totally_ordered`

Ну а любителям С++98, для кого раньше было лучше, придется немного потрудиться, выписывая 12 перегрузок этих операторов вручную.
Re: Автоматически создать операторы отношений/сравнений
От: Шахтер Интернет  
Дата: 07.05.20 10:54
Оценка:
Здравствуйте, Marty, Вы писали:

M> Здравствуйте!


M>Есть у меня структура. Сделал я для неё метод (можно и свободную функцию) compare, которая возвращает int. Можно как-то сформировать операторы всей пачкой на базе этого метода? Ну, <, <=, >, >=, ==, !=, чтобы ручками не выписывать?


В С++20 использовать operator <=>.
А до него можно использовать шаблонную магию, как у меня здесь .

class C : public CmpComparable<C> // provides all comparison operators for class C
 {
  public:

   // cmp objects

   CmpResult objCmp(const C &obj) const { .... }
 };
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[2]: Автоматически создать операторы отношений/сравнений
От: Marty Пират  
Дата: 07.05.20 19:32
Оценка:
Здравствуйте, Шахтер, Вы писали:


Ш>В С++20 использовать operator <=>.

Ш>А до него можно использовать шаблонную магию, как у меня здесь .

Ну, я что-то такое предполагал, но думал, что есть стандартное
Вам как-бы показали сцыкливое мурло российской оппозиции — вот оно
Автор: Министр Промышленности
Дата: 17.10.19
!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.