を比較しますタイプは全く異なります:テンプレートは、私は、次のテンプレートクラスを持っているオペレータ
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;
}
integer case
を(私はQtのqFuzzyCompareとqFuzzyIsNullを使用しています):
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;
}
両方LeftType
とRightType
整数場合integer case
を有効にして、少なくとも一つのLeftType
またはRightType
が本当であれば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 (not is_equal(left(i,j), right(i,j)) {
return false;
}
}
}
return true;
}
、その後、あなたがis_equalのいくつかのオーバーロードされたバリアントを定義またはテンプレートをis_equal作り、それが
template<class T>
bool is_equal(const T a, const T b);
template<>
bool is_equal<int>(const int a, const int b){
return a == b;
}
template<>
bool is_equal<real>(const real a, const real b){
...
}
(または2つ以上のテンプレートとしてのような特殊化、だ定義のいずれか:これについて
過負荷 '=' '本物type'があなたのためには、両方に同じ機能を使用できるように? – NathanOliver
テンプレートの特殊化を使用して、LeftTypeとRightType = intの1つのバージョンをescpacallyで書くことができます。したがって、両方とも整数の場合、特殊関数は常に呼び出されます。変換が望ましくない場合、そのケースについて明示的に追加することも考えられます。 – Aeonos
'template specialization'はあなたが探しているものです。しかし、@ NathanOliverは正しいですが、ロジック(ネストされたforループ)は同じであり、実際の型に対して演算子!=をオーバーロードするほうが良いかもしれません。 –