我尝试使用模板参数中给出的维度和类型创建可重用的矩阵类。结构本身只是:
template <unsigned int N, unsigned int M, typename T>
struct Matrix
{
T elements[N* M];
};
当我尝试实现矩阵乘法时,我遇到了一个需要引入新模板参数的问题。原始矩阵的大小为N * M.第二个矩阵的大小为L * N,结果矩阵为N * K.因此乘法函数看起来像:
Matrix<N, K, T> Multiply(const Matrix<L, N, T>& other) {... }
但是我需要为该函数创建一个模板,因此调用将变为mat.Multiply<x, y>(mat2)
,这意味着我必须指定两次。有办法避免这种情况吗? (类似于Matrix<N, unsigned int K, T>
)
编辑:我试过这个:
template <unsigned int K, unsigned int L>
Matrix<N, K, T> Multiply(const Matrix<L, N, T>& other)
使用此代码,我收到错误消息,说明没有函数模板的实例与参数列表匹配:
Matrix<3, 2, int> mat;
Matrix<2, 3, int> mat2;
mat.Multiply(mat2)
顺便说一句,我使用的是MSVC和Visual Studio。
答案 0 :(得分:2)
所以调用将成为
mat.Multiply<x, y>(mat2)
如果乘法成员函数是像这样的函数模板
template <unsigned int N, unsigned int M, typename T>
struct Matrix
{
template <unsigned int L>
Matrix<N, L, T> Multiply(const Matrix<M, L, T>& other) {... }
T elements[N * M];
};
然后模板参数推导允许你像这样调用函数:
mat.Multiply(mat2)
注意:您也应考虑实施非成员operator*
,以实现此目的:
auto mat3 = mat * mat2;