Hatred's Log Place

DON'T PANIC!

Sep 29, 2017 - 1 minute read - Comments - programming c++

C++: операторы сравнения для структур

Памятка: * https://stackoverflow.com/questions/3882467/defining-operator-for-a-struct (второй ответ) * http://www.cplusplus.com/reference/tuple/tuple/operators/

Т.е. используя std::tie() вполне, без труда и пыли, можно сделать операторы сравнения для сложных структур. Сложности могут возникнуть, если нужно переопределить операторы сравнения для отдельных элементов (например: критерии сравнения строк).

Почему tie, а не напрямую tuple? tie захватывает аргументы по ссылке - экономия на копировании.

Пример:

bool operator<(const Foo& l, const Foo& r)
{
  return std::tie(l.a, l.b, l.c) < std::tie(r.a, r.b, r.c);
}

Я делаю через макрос вспомогательный:

bool operator<(const Foo& l, const Foo& r)
{
#define WRAP(x) std::tie(x.a, x.b, x.c)
  return WRAP(l) < WRAP(r);
#undef WRAP
}