【问题标题】:Is the matrix multiplication possible with template arguments是否可以使用模板参数进行矩阵乘法
【发布时间】:2016-12-06 23:18:00
【问题描述】:

让我定义一个矩阵类如下

template<typename T, size_t rowSize, size_t colSize>
class Matrix
{
 //Class implementation
};

现在如果我有 2 个矩阵定义为

Matrix<double,3,2> A;
Matrix<double,2,5> B;
A*B;

可以做乘法吗,如果我尝试它会说没有参数可以将 rhs 作为 double,2,5 for *.是否可以将模板泛化为乘以 'double,x,y' 和 'double,y,z' 并返回一个新矩阵 'double,x,y'

【问题讨论】:

  • 重载 * 符号。您的函数原型类似于: Matrix operator*(Matrix A, Matrix B)
  • 对不起,但我不知道如何使用不同的参数进行重载,是不是类似于 templateMatrix& operator*(const Matrix &obj)

标签: c++ templates


【解决方案1】:
template<typename T, size_t rowSize, size_t colSize>
class Matrix
{
    // Implementation
};

template<
    typename T,
    typename U,
    size_t rowSize1,
    size_t commonSize,
    size_t colSize2
>
auto operator * (Matrix<T, rowSize1,commonSize> const & a,
                 Matrix<U, commonSize,colSize2> const & b)
  -> Matrix<decltype(std::declval<T>()*std::declval<U>()), rowSize1, colSize2>
{
    // Implementation
}

int main()
{
    Matrix<double,3,2> A;
    Matrix<double,2,5> B;
    auto C = A*B;
}

或作为会员:

template<typename T, size_t rowSize, size_t colSize>
class Matrix
{
public:
    template<typename U, size_t colSize2>
    auto operator * (Matrix<U, colSize,colSize2> const & b)
      -> Matrix<decltype(std::declval<T>()*std::declval<U>()), rowSize, colSize2>
    {
        // Implementation
    }

};

【讨论】:

  • 非常感谢,我在矩阵类中尝试了这个,它已经有一个模板。难道不能这样吗?
  • @user3345850 当然可以。类似于template&lt;typename U, size_t otherColSize&gt; auto operator*(Matrix&lt;U, colSize, otherColSize&gt; const&amp; other) { ... }。不过,这个声明看起来有点尴尬,因为 colSize 被用作 otherrowSize
  • 类似于成员 * 的 2 参数朋友声明是第三个选项。另请注意,矩阵极大地受益于表达式模板。
  • 您能否给我一个想法,如何在不返回 auto 的情况下实现相同的功能(就像在旧的 c++03 中一样)?只是好奇。
【解决方案2】:

可以覆盖类中的* 运算符。 但是一般情况下

    T& T::operator*(T otherMatrix);
    {
      //do multiplication by hand and return a new Matrix
    }

而不是将double 作为唯一类型。

【讨论】:

  • 好吧对不起,我问的不是重载函数
  • 如果您要求进行类型检查,也许您可​​以使用typeid()function:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多