Вы также можете перегрузить операторов, если хотите сравнить
enum EEE {
X1 = 1
};
bool operator<(EEE e, std::size_t u) {
return (int)e < (int)u;
}
Однако вы должны сделать этот танец для любого целочисленного типа с правой стороны. Иначе, если вы сделаете e < 2
, это будет неоднозначно: компилятор может использовать ваше operator<
, точно совпадающее с левой стороной, но требующее преобразования на правой стороне, или его встроенный оператор, требующий повышения для левой стороны и сопоставления Правая сторона точно.
Итак, в конечном итоге я бы поставил следующие версии:
/* everything "shorter" than "int" uses either int or unsigned */
bool operator<(EEE e, int u) {
return (int)e < (int)u;
}
bool operator<(EEE e, unsigned u) {
return (unsigned int)e < (unsigned int)u;
}
bool operator<(EEE e, long u) {
return (long)e < (long)u;
}
bool operator<(EEE e, unsigned long u) {
return (unsigned long)e < (unsigned long)u;
}
/* long long if your compiler has it, too */
Не очень приятно :) Но, по крайней мере, пользователь вашего перечисления спокоен. Однако, если вы в конечном итоге не хотите сравнивать с обычным int
, а с каким-то значимым значением, я бы сделал то, что предложил другой парень, и добавил бы другой перечислитель со значением 2
, и назвал бы его. Таким образом, предупреждения тоже исчезнут.