Предотвращение дублирования кода для функций с сигнатурами, отличающимися только семантикой lvalue / rvalue - PullRequest
0 голосов
/ 11 ноября 2018

Мне нужно реализовать функции (точнее, операторы) с сигнатурами, похожими на эти:

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?Есть ли побочные эффекты, о которых я не знаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...