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

时间:2018-11-11 14:53:11

标签: c++ c++11 move code-duplication

我需要使用签名来实现功能(具体来说是运算符):

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

没有答案