是否可以创建一个接受多种数据类型的C ++函数?

时间:2018-04-09 19:32:03

标签: c++ templates

我正在编写一个必须支持多个操作的Matrix类。其中之一是将矩阵乘以另一个矩阵或相同类型的矩阵数据的标量。另一个是实现* =运算符。

当前代码(工作):

template <typename T>
Matrix<T>& Matrix<T>::operator*=(const Matrix<T> &rhs) {
    Matrix<T> lhs = *this;
    *this = lhs*rhs;
    return *this;
}

template <typename T>
Matrix<T>& Matrix<T>::operator*=(T num) {
    Matrix<T> lhs = *this;
    *this = lhs * num;
    return *this;
}
template<typename T>
const Matrix<T> Matrix<T>::operator*(T scalar) const {
    Matrix<T> result(rows, cols);
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            //std::cout << "adding elements at [" << i << "][" << j << "]" << std::endl;
            result[i][j] = this->data[i][j] * scalar;
        }
    }
    return result;
}

template<typename T>
const Matrix<T> Matrix<T>::operator*(const Matrix<T> &b) const {
    Matrix<T> a = *this;
    if(a.cols != b.rows)
        throw DimensionMismatchException();
    int rows = a.rows;
    int cols = b.cols;
    Matrix<T> result(rows, cols);
    for(int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++)
        for(int k = 0; k < a.cols; k++)
            result[i][j] += a[i][k]*b[k][j];
    return result;
}

我的问题:是否可以实现* =运算符,以便不需要2个不同的函数?我也很好奇是否可以使用*运算符进行类似的操作,因为这些方法中的代码由于矩阵乘法的性质而非常不同,因此事情稍微优雅一些​​。

1 个答案:

答案 0 :(得分:3)

功能应该做一件事,做得好。如果您发现在同一个函数中有两个非常不同的实现,那么如果拆分函数,您的代码可能会更易于维护并且更易于阅读。

你在这里的分裂很好。很明显,运营商*有两个主要案例需要应对。一个乘以标量的地方和另一个乘以矩阵的地方。