C ++介绍' new'模板参数

时间:2016-04-09 07:25:32

标签: c++ templates

我尝试使用模板参数中给出的维度和类型创建可重用的矩阵类。结构本身只是:

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。

1 个答案:

答案 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;