Вот версия, которая опирается на логическое правило короткого замыкания, чтобы избежать явного ветвления
template
bool operator< (T const& a, T const& b)
{
return (
( a.field1 < b.field1 ) || (( a.field1 == b.field1 ) &&
( a.field2 < b.field2 ))
);
}
. Это предполагает, что ваш примитивный тип field1
имеет operator==
. Это утомительно вводить это для более чем двух полей, но вы можете использовать std::lexicographical_compare
, если ваш класс obj
сохраняет поля внутри std::array
для некоторого типа T
и размера N
template
struct obj
{
std::array field;
};
bool operator< (obj const& a, T const& b)
{
return std::lexicographical_compare(
a.field.begin(), a.field.end(),
b.field.begin(), b.field.end()
);
}
Обратите внимание, что есть проект документа N3326 , который обсуждает автоматически добавление операторов ==
и <
для типов классов.