У меня есть следующий класс шаблона:Шаблона сравнение оператора
template<int size, typename Type>
class Matrix {
public:
Matrix();
...
Type operator()(int row, int column) {...}
private:
std::array<Type, size*size> _array;
}
И я хочу, чтобы перегрузить оператор equal to
сравнения сравнить Matrix
объектов:
template <int size, typename LeftType, typename RightType>
bool operator ==(const Matrix<size, LeftType> & left, const Matrix<size, RightType> & right) {
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
...
}
}
}
Проблема заключается в том, что сравнение целочисленных типов и реальных типы совершенно разные:
real case
:
template <int size, typename LeftType, typename RightType>
bool operator ==(const Matrix<size, LeftType> & left, const Matrix<size, RightType> & right) {
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
if (qFuzzyIsNull(left(i, j)) || qFuzzyIsNull(right(i, j))) {
if (!qFuzzyCompare(left(i, j) + 1, right(i, j) + 1)) {
return false;
}
} else {
if (!qFuzzyCompare(left(i, j), right(i, j))) {
return false;
}
}
}
}
return true;
}
(Я использую Qt-х qFuzzyCompare и qFuzzyIsNull)
integer case
:
template <int size, typename LeftType, typename RightType>
bool operator ==(const Matrix<size, LeftType> & left, const Matrix<size, RightType> & right) {
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
if (left(i, j) != right(i, j)) {
return false;
}
}
}
return true;
}
Как включить integer case
если оба LeftType
и RightType
целое и позволяют real case
если по крайней мере один LeftType
или RightType
реально ?
перегрузки '=' 'для реального type', так что вы можете использовать ту же функцию для обоих!? – NathanOliver
Вы можете использовать специализированную специализацию и написать одну версию escpacally для LeftType и RightType = int. Поэтому специальная функция всегда будет вызываться, если оба они целые. Также можно подумать о добавлении явного для этого случая, если не требуется конверсия. – Aeonos
'шаблон специализации' - это то, что вы ищете. Но @NathanOliver прав, логика (вложенный цикл) одинакова, и может быть лучше перегрузить operator! = Для реального типа. –