在我的代码中,我有一个像这样的重载
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
来编写这样的运算符的两个不同版本?
THX
答案 0 :(得分:3)
我认为,没有std::enable_if
只需写下这样的其他operator=
:
template<int L>
inline StaticMemory<L>& StaticMemory<L>::operator =(const StaticMemory<L>& _m)
{
if (this != &_m) { //There are no problem here!
set_ui(this->mem, _m.mem, L, L);
}
return *this;
}
如果StaticMemory
模板参数相同,这将有效。
如果它们不同,您的示例代码将起作用,您可以在其中投射任何您想要的内容
修改:正确性证明:
#include <iostream>
template <int I>
struct Temp {
template <int L>
void operator=(const Temp<L>&) {
std::cout << "Called with L\n";
}
void operator=(const Temp<I>&) {
std::cout << "Called with I\n";
}
};
int main() {
Temp<1> t1;
Temp<2> t2;
t1 = t1;
t1 = t2;
}
这里的输出是:
Called with I
Called with L