Определение == и & lt; для структур со многими членами данных

Как обобщить определение < если структура имеет произвольное количество элементов данных (< должен быть определен с использованием порядка, в котором перечислены элементы данных)? Простой пример с 3 членами данных:

struct nData {
int a;
double b;
CustomClass c;   // with == and < defined for CustomClass
bool operator == (const nData& other) {return (a == other.a) && (b == other.b) && (c == other.c);}
bool operator < (const nData& other) {
if (  (a < other.a)  ||  ((a == other.a) && (b < other.b))  ||
((a == other.a) && (b == other.b) && (c < other.c))  )
return true;
return false;
}
};

Использование вариадических шаблонов и рекурсии как-то?

4

Решение

Ты можешь использовать std::tie создать кортеж ссылок на членов класса и использовать операторы лексикографического сравнения, определенные для кортежей:

bool operator < (const nData& other) const {  // better make it const
return std::tie(a,b,c) < std::tie(other.a, other.b, other.c);
}
15

Другие решения

Эта структура легко масштабируется и позволяет использовать произвольные функции сравнения (например, strcmp)

if (a != other.a) return a < other.a;
if (b != other.b) return b < other.b;
if (c != other.c) return c < other.c;
return false;
3

По вопросам рекламы [email protected]