如何使模板函数(运算符)隐式推导模板参数?

how to make template function (operator) deduce template arguments implicitly?

我有这段代码需要编译:

int main () {
    const Matrix<int, 3, 2> m1; // Creates 3*2 matrix, with all elements set to 0;
    Matrix<int, 3, 3> m2(4); // Creates 3*3 matrix, with all elements equals to 4;
    const Matrix<int, 3, 3> m3 = m2; // Copy constructor may take O(MN) and not O(1).
    cout << m3 * m1 << endl; // You can choose the format of matrix printing;

我已经为模板矩阵实现了 operator<<。 问题是实现 operator* 以便使用 m3.rows 和 m1.cols 的模板参数创建一个新矩阵,即正确 return 键入 operator* 的签名结果表达式。

我试过了:

Matrix<int, lhs.rows, rhs.cols> operator *(const MatrixBase& lhs, const MatrixBase& rhs)
Matrix<?> res; // not sure how to define it
{
    for (int i = 0; i < lhs.get_columns(); i++)
    {
        for (int j = 0; j < rhs.get_rows(); j++)
        {
            for (int k = 0; k < lhs.get_columns(); k++)
            {
                res[i][j] = lhs[i][k] * rhs [k][j];
            }
        }
    }
}

class MatrixBase 只是一个非模板抽象 class Matrix 派生自,试图使 operator* 通用。 问题是 lhsrhs 还没有初始化,它没有编译,我想把 operator* 作为 Matrix 的方法,但我仍然停留在 return 类型。 我知道模板是由预处理器决定的,但我确信有办法做到这一点 运行.

您的问题缺少有关 MatrixBase 是什么的一些信息,但如果我们只查看您的 Matrix class,您需要一个模板函数来执行此操作。在那里你可以推断出 classes 的模板参数并使用它来计算结果类型。

template <typename T, int LRows, int LCols, int RRows, int RCols>
Matrix<T, LRows, RCols> operator*(const Matrix<T, LRows, LCols>& lhs, const Matrix<T, RRows, RCols>& rhs) {
    static_assert(LCols == RRows, "Invalid matrix multiplication");
    Matrix<T, LRows, RCols> result;
    // ... do the calculations
    return result;
}