模板类的赋值运算符

时间:2014-11-29 13:29:36

标签: c++ templates assignment-operator

我有这个例子:一个矩阵的类,矩阵的维度作为模板参数给出。

template <std::size_t DIM>
class Matrix {
   // ...
};

int main()
{
  Matrix<2> m2;
  Matrix<4> m4;

  m2 = m4;
}

Wat我的赋值运算符是否必须将DIM的{​​{1}}从2更改为4?

2 个答案:

答案 0 :(得分:6)

template <std::size_t DIM>
class Matrix {

  template <std::size_t OtherDim>
  Matrix& operator=(const Matrix<OtherDim>& rhs)
  {
    // whatever magic you need in here
    return *this;
  }

};

Matrix<DIM>Matrix<OtherDim>是两种不同的类型。

要问的第一个问题是,&#34;是否存在将Matrix<4>分配给Matrix<2>的逻辑操作?&#34;。

答案可能是&#34; no&#34;。

Matrix<2>Matrix<2>之间可能存在有效的分配:

template <std::size_t DIM>
class Matrix {
  // implement a copy constructor...
  Matrix(const Matrix& rhs)
  : /* copy-initialise all data */
  {
    /* any other copy-related logic */
  }

  // ...and a copy-assignment operator
  Matrix& operator=(const Matrix& rhs)
  {
    if (&rhs != this) {
      Matrix tmp(rhs);
      std::swap(*this, tmp);
    }
    return *this;
  }

};

答案 1 :(得分:4)

  

Wat我的赋值运算符必须要将m2的DIM从2更改为4?

你做不到,这是不可能的。

您无法更改对象的类类型的模板参数,它是该类型的静态属性,而不是可在运行时更改的动态属性。

您可以将int从值4更改为值3,但不能将其更改为long。同样,您可以更改Matrix<2>的值,但无法将其类型更改为Matrix<4>

没有办法m2 = m4并且意味着任何明智的事情。

也许您希望维度是类型的动态属性,而不是模板参数:

class Matrix {
  std::size_t m_dim;
  // ...
};

现在您可以在运行时更改该值,因此分配该类型可以更改其m_dim值。