代码之家  ›  专栏  ›  技术社区  ›  V0ldek

防止签名仅在左值/右值语义上不同的函数的代码重复

  •  1
  • V0ldek  · 技术社区  · 6 年前

    我需要实现具有如下签名的函数(具体是运算符):

    friend MyClass operator+(MyClass&& lhs, MyClass& rhs);
    friend MyClass operator+(MyClass&& lhs, MyClass&& rhs);
    friend MyClass operator-(MyClass&& lhs, MyClass& rhs);
    friend MyClass operator-(MyClass&& lhs, MyClass&& rhs);    
    
    MyClass& operator+=(MyClass& other);
    MyClass& operator+=(MyClass&& other);
    MyClass& operator-=(MyClass& other);
    MyClass& operator-=(MyClass&& other);
    

    这是8个函数,但在道德上只有两个实现,因为所有+和-操作基本相同。我不想为了迎合不同的右值签名而写同样的东西4次。有没有一种规范的方法可以做到这一点?我想出了这样的办法:

    MyClass& operator+=(MyClass&& other) {
        ... // Actual implentation details.
        return *this;
    }
    
    MyClass& operator+=(MyClass& other) {
        return *this += std::move(other);
    }
    
    MyClass operator+(MyClass&& lhs, MyClass&& rhs) {
        auto myClass = MyClass();   // Copy ctor is deleted.
        myClass += rhs;
    
        return myClass;
    }
    
    MyClass operator+(MyClass&& lhs, MyClass& rhs) {
        return std::move(lhs) + std::move(rhs);
    }
    
    // Similar implementations for operator- and operator-=.
    

    这似乎是可行的,但由于我对移动语义学的世界没有真正的信心,我不确定我是否写了一些可怕的东西,有一种更简单、更干净的方法来做到这一点。例如,使用 std::move ? 有没有我不知道的副作用?

    0 回复  |  直到 6 年前