模板类的赋值运算符
Posted
技术标签:
【中文标题】模板类的赋值运算符【英文标题】:Assignment operator of template class 【发布时间】:2015-01-27 22:47:11 【问题描述】:我有这个例子:一个矩阵类,矩阵的维数作为模板参数给出。
template <std::size_t DIM>
class Matrix
// ...
;
int main()
Matrix<2> m2;
Matrix<4> m4;
m2 = m4;
我的赋值运算符必须看起来像将 m2
的 DIM
从 2 更改为 4 吗?
【问题讨论】:
Matrix<2> m2 ();
不会实例化矩阵对象。它将声明一个函数。
我的示例是我的实际课程的一个非常简单的版本,但在实际课程中,结构如下所示: Tableint
从值 4 更改为值 3,但不能将其更改为 long
。同样,您可以更改Matrix<2>
的值,但不能将其类型更改为Matrix<4>
【参考方案1】:
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>
是两种不同的类型。
要问的第一个问题是,“将Matrix<4>
分配给Matrix<2>
是否存在逻辑操作?”。
答案可能是“不”。
但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;
;
【讨论】:
是的,这就是我尝试过的,但它不知道如何在操作员中将 DIM 更改为 OtherDim 您无法更改 Dim,这是其类型的一部分,您无法更改对象的类型 @JonathanWakely 这是我的想法,所以这告诉我们运算符必须返回 MatrixMatrix<4>
或Matrix<2>
?【参考方案2】:
我的赋值运算符必须看起来像将 m2 的 DIM 从 2 更改为 4 吗?
你不能这样做,这是不可能的。
您不能更改对象类类型的模板参数,它是该类型的静态属性,而不是可以在运行时更改的动态。
您可以将 int
从值 4 更改为值 3,但不能将其更改为 long
。同样,您可以更改Matrix<2>
的值,但不能将其类型更改为Matrix<4>
。
没有办法做到m2 = m4
并让它意味着任何明智的事情。
也许您希望维度是类型的动态属性,而不是模板参数:
class Matrix
std::size_t m_dim;
// ...
;
现在您可以在运行时更改值,因此分配给类型可以更改其m_dim
值。
【讨论】:
以上是关于模板类的赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章