Я думаю, что проблема более общая, чем у единственного ==
оператора.
Оператор ==
тесно связан с !=
и, возможно, связан с <
, >
, <=
и >=
.
Определение должно быть согласованным среди всех из них, то есть либо возможно сравнение двух массивов разного размера (независимо от используемого сравнения), либо это не так.
Я подозреваю, что оба могут быть полезны:
- Ошибка во время компиляции: вы предупреждены, что здесь есть что-то подозрительное
- время выполнения ложно: вам не нужно специализировать все методы вашего шаблона для работы с разными размерами.
Но только одно выдает предупреждение во время компиляции, другое подразумевает, что вы надеетесь обнаружить проблему во время выполнения (через тестирование). Поэтому я бы предоставил «безопасную» перегрузку оператора и более подробный метод для «мягкого» сравнения:
template <typename T, size_t M, size_t N>
bool soft_equal(array<T,M> const& lhs, array<T,N> const& rhs)
{
if (M != N) { return false; }
// comparison logic
}
template <typename T, size_t M>
bool operator==(array<T,M> const& lhs, array<T,M> const& rhs)
{
return soft_equal(lhs,rhs); // count on the compiler to eliminate the 'if'
}
Таким образом, вы получаете лучшее из обоих миров, я думаю:
- Неосторожный предупреждается при компиляции
- Ошибка времени компиляции может быть легко устранена, если она предназначена
Рекомендация: упростить правильное понимание, а трудно ошибочное