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

标签 c++ templates arguments operator-keyword

我正在探索 C++,我想使用模板创建一个迷你数学矩阵库。

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

如果我这样描述一个矩阵: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;

我搜索过但没有找到这个问题的答案(也许是因为我真的不知道我必须准确搜索什么)。

感谢您的帮助:)

最佳答案

你需要让你的 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...
}

关于具有不同参数的 C++ 运算符重载模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40222279/

相关文章:

C++ 将流传递给类方法

c++ - 模板函数使用参数包时如何传递其他模板参数?

C++ 专门针对枚举的函数

c - 将接收到的参数传递给回调函数

c++ - 在 Qt 中撤消 QTableWidget 的单个单元格?

c++ - 对象在另一个对象的变量内消失

c++ - 实现接受索引数组的下标运算符

c++ - 在 FFMPEG 的 C++ 代码中使用最短参数

java - Kotlin:将 Array 作为 vararg 参数传递时参数类型不匹配

c++ - 在相同状态类型的各种屏幕之间切换?