2014-02-17 1 views
4

Как обобщить определение <, если структура имеет произвольное число членов данных (<), определяется с помощью порядка, в котором перечислены члены данных)? Простой пример с 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; 
    } 
}; 

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

+0

Однако вы хотите, чтобы данные были заказаны. – SLaks

ответ

3

Эта структура легко масштабируется и позволяет использовать произвольные функции сравнения (например 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; 
+0

Вышеупомянутые решения хороши для, например, для 20 членов данных. Большое спасибо. Но что, если есть сотни членов данных? например int a1, a2, a3, ..., a1000; Есть ли метод рекурсии для обработки этого? – prestokeys

+0

Редактировать, если элементы данных были int a1, a2, a3, ..., a1000; то std :: vector будет членом данных, чтобы удерживать все это (а затем использовать std :: lexicographic_compare). Итак, что, если элементы данных были int a1, a2, ..., a500; double b1, b2, ...., b300; и т.д... ? – prestokeys

+0

@prestokeys: Ваш дизайн сломан. Если у вас есть много переменных-членов, организуйте их в каком-то контейнере (массив, карта, что угодно). –

15

Вы можете использовать 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); 
} 
+1

И я полагаю, что если вы хотите спускать сортировку для некоторых переменных, используйте 'tie (a, other.b, c)

+2

Можно упомянуть http://stackoverflow.com/questions/6218812/implementing-comparision-operators-via-tuple-and-tie-a-good-idea – user2672165

+0

Имеет ли смысл добавить оператор неявного преобразования в кортеж ссылок, так что все эти операторы реализуются косвенно через кортеж? Или существует потенциальный риск при этом? (То же самое обсуждение, позволяющее int-wrappers преобразовывать в int, чтобы мы могли вычислить с этими обертками, привести к выводу, что вы не должны этого делать.) – leemes

Смежные вопросы