C ++模板,使用enable_if为运算符的两个不同实现

时间:2016-12-01 11:10:04

标签: c++ c++11 templates typetraits

在我的代码中,我有一个像这样的重载

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

1 个答案:

答案 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