Detecção de tipo de multiplicação de matriz C ++

No meu código C ++, tenho uma classe Matrix e alguns operadores escritos para multiplicá-los. Minha turma é modelada, o que significa que posso ter matrizes int, float, double ...

Minha sobrecarga de operador é clássica, eu acho

    template <typename T, typename U>
    Matrix<T>& operator*(const Matrix<T>& a, const Matrix<U>& b)
    {
    assert(a.rows() == b.cols() && "You have to multiply a MxN matrix with a NxP one to get a MxP matrix\n");
    Matrix<T> *c = new Matrix<T>(a.rows(), b.cols());
    for (int ci=0 ; ci<c->rows() ; ++ci)
    {
      for (int cj=0 ; cj<c->cols() ; ++cj)
      {
        c->at(ci,cj)=0;
        for (int k=0 ; k<a.cols() ; ++k)
        {
          c->at(ci,cj) += (T)(a.at(ci,k)*b.at(k,cj));
        }
      }
    }
    return *c;
  }

Neste código, retorno uma matriz do mesmo tipo que o primeiro parâmetro, ou seja,Matrix<int> * Matrix<float> = Matrix<int>. Minha pergunta é: como posso detectar o tipo mais preciso entre os dois que dou para não perder muita precisão, ou seja, terMatrix<int> * Matrix<float> = Matrix<float> ? Existe uma maneira inteligente de fazer isso?

questionAnswers(1)

yourAnswerToTheQuestion