我有这个例子:一个矩阵的类,矩阵的维度作为模板参数给出。
template <std::size_t DIM>
class Matrix {
// ...
};
int main()
{
Matrix<2> m2;
Matrix<4> m4;
m2 = m4;
}
Wat我的赋值运算符是否必须将DIM
的{{1}}从2更改为4?
答案 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
值。