2017-02-16 8 views
0

を比較しますタイプは全く異なります:テンプレートは、私は、次のテンプレートクラスを持っているオペレータ

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のqFuzzyCompareqFuzzyIsNullを使用しています):

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; 
} 

両方LeftTypeRightType整数場合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つ以上のテンプレートとしてのような特殊化、だ定義のいずれか:これについて

+4

過負荷 '=' '本物type'があなたのためには、両方に同じ機能を使用できるように? – NathanOliver

+0

テンプレートの特殊化を使用して、LeftTypeとRightType = intの1つのバージョンをescpacallyで書くことができます。したがって、両方とも整数の場合、特殊関数は常に呼び出されます。変換が望ましくない場合、そのケースについて明示的に追加することも考えられます。 – Aeonos

+2

'template specialization'はあなたが探しているものです。しかし、@ NathanOliverは正しいですが、ロジック(ネストされたforループ)は同じであり、実際の型に対して演算子!=をオーバーロードするほうが良いかもしれません。 –

答えて

1

方法それが起こることがある場合はタイプしてください)

もちろん、演算子自体を専門にすることはできますが、同じコードを何も書かずにもう一度書く必要がありますあなたがそれを再利用するチャンス。一方、is_equalはあなたのプログラムで共通のツールになる可能性があります。

(注:これは明らかに、名前空間にする必要がありますのでis_equalは、やや基本的な名前です)!

関連する問題