Перегрузка ссылок на значения R и дублирование кода

Примите во внимание следующее:

struct vec
{
    int v[3];

    vec() : v() {};
    vec(int x, int y, int z) : v{x,y,z} {};
    vec(const vec& that) = default;
    vec& operator=(const vec& that) = default;
    ~vec() = default;

    vec& operator+=(const vec& that)
    {
        v[0] += that.v[0];
        v[1] += that.v[1];
        v[2] += that.v[2];
        return *this;
    }
};

vec operator+(const vec& lhs, const vec& rhs)
{
    return vec(lhs.v[0] + rhs.v[0], lhs.v[1] + rhs.v[1], lhs.v[2] + rhs.v[2]);
}
vec&& operator+(vec&& lhs, const vec& rhs)
{
    return move(lhs += rhs);
}
vec&& operator+(const vec& lhs, vec&& rhs)
{
    return move(rhs += lhs);
}
vec&& operator+(vec&& lhs, vec&& rhs)
{
    return move(lhs += rhs);
}

Благодаря ссылкам на r-значения, с помощью этих четырех перегрузок оператора + I можно минимизировать количество создаваемых объектов, повторно используя временные объекты. Но мне не нравится такое дублирование кода. Могу ли я добиться того же с меньшим количеством повторений?

15
задан R. Martinho Fernandes 24 August 2011 в 02:40
поделиться