具有不同参数的C ++运算符重载模板

时间:2016-10-24 15:36:02

标签: c++ templates arguments operator-keyword

我正在发现C ++,我想使用模板创建一个迷你数学Matrix librairy。

在这里,我想重载运算符*。

如果我描述这样的矩阵:M(y, x) M矩阵名称yx高度和宽度,矩阵乘法应该看起来像:

M(a, b) * N(b, c) = R(a, c)

目前我有这段代码:

template<unsigned int y, unsigned int x>
class Matrix
{
public:
    Matrix() { }
    ~Matrix() { }

    Matrix<y, x2>& operator*(const Matrix<y2, x2>& right)
    {
        // code...  
    }
private:
    std::array<std::array<double, x>, y>    m_values;
};

所以我希望能够将两个不同的矩阵相乘:

Matrix<3, 4> m;
Matrix<4, 2> n;

// fill the matrix with values

Matrix<3, 2> o = m * n;

我已经搜索了但是我找不到这个问题的答案(也许是因为我真的不知道我必须要搜索的内容)。

感谢您的帮助:)

2 个答案:

答案 0 :(得分:3)

您需要制作operator* 模板成员函数,如下所示:

template <unsigned int y2, unsigned int x2>
Matrix<y, x2> operator*(const Matrix<y2, x2>& right)
{
    // code...  
}

请注意,返回类型不再是引用,因为operator*应该返回一个新值 - 如果您愿意,可以定义一个补充operator*=,它可以就地修改LHS矩阵。

另一件需要注意的事情是,矩阵乘法只有在矩阵的维数一致时才有意义:即,如果LHS中的列数与RHS中的行数匹配。要强制执行此操作,您可以在成员函数中使用static_assert来确保模板参数一致:

template <unsigned int y2, unsigned int x2>
Matrix<y, x2> operator*(const Matrix<y2, x2>& right)
{
    static_assert(y2 == x, "Matrix dimensions mismatched");
    // code...
}

答案 1 :(得分:0)

这很简单,将operator*定义为函数模板。示例自由函数模板:

template<unsigned y1, unsigned x1, unsigned y2, unsigned x2>
Matrix<y1, x2> operator*(Matrix<y1, x1> const& l, Matrix<y2, x2> const& r)
{
    // static_assert(x1 == y2, "Matrices cannot be multiplied");
    Matrix<y1, x2> ret{};
    // multiply
    return ret;
}

请注意operator*按值返回。这一点尤其重要,因为你返回一个不同的类型并且没有对象返回引用(除了惯用的正确性)。