【发布时间】:2016-12-01 11:10:04
【问题描述】:
在我的代码中的某个时刻,我有这样的重载
template<int L>
template<int M>
inline StaticMemory<L>& StaticMemory<L>::operator =(const StaticMemory<M>& _m)
{
if (this != &_m) { //Problem here!
set_ui(this->mem, _m.mem, L, M);
}
return *this;
}
发生的情况是我突出显示的检查基本上是错误的,因为当L != M 指针比较无效时,除非我强制转换它。
我可能可以转换指针,但是有没有办法使用std::enable_if 来编写这样的运算符的两个不同版本?
谢谢
【问题讨论】:
-
你在问什么?你是在问是否可以为
L == M编写一个版本的函数,为L != M编写另一个版本的函数? -
是的,这就是我要问的。
-
调用
M == L并不像看起来那么简单。只有显式调用才会这样做:l1->operator=<L>(l2);否则将调用复制分配。 -
我不明白,L == M 的情况会正确重载赋值运算符吗?
-
@user8469759:
M == L的情况很特殊,因为它与 copy assignment(不是 template)相似 >)。当您提供StaticMemory<L>时,将进行复制分配。这就是为什么std::enable_if的解决方案(或具有专业化的解决方案)不能解决您的问题,您必须直接提供复制分配。
标签: c++ c++11 templates typetraits