Перегрузка оператора присваивания с одинаковым кодом для нескольких подписей? - PullRequest
0 голосов
/ 01 октября 2019

Скажем, у меня есть класс C:

class C {
    int m_i { 0 };
};

Теперь этот класс можно использовать для энергонезависимых и энергозависимых объектов:

C x;
volatile C y;

Я хочу иметь возможность назначать энергозависимыек нелетучим, нелетучим к летучим и нелетучим к нелетучим. Поэтому я перегружаю оператор присваивания Си:

class C {
    int m_i { 0 };
public:
    void operator=(const volatile C& source) volatile {
        m_i = source.m_i;
    }

    void operator=(const C& source) {
        m_i = source.m_i;
    }
};

Можно ли это сделать СУХОЙ, без повторения кода в функциях operator=?

1 Ответ

0 голосов
/ 02 октября 2019

Итак, подумав некоторое время, это лучшее решение, которое я смог найти:

class C {
    int m_i { 0 };

    void assignFrom(const volatile C& src, const bool volatileSrc = true, const bool volatileSelf = true) volatile {
        auto& nqSrc = volatileSrc ? src : const_cast<const C&>(src);
        auto& self = volatileSelf ? *this : *const_cast<C*>(this);
        self.m_i = nqSrc.m_i;
    }

public:
    void operator=(const C& src) volatile {
        // non-volatile to volatile assignment
        assignFrom(src, false);
    }

    C& operator=(const volatile C& src) {
        // volatile to non-volatile assignment
        assignFrom(src, true, false);
        return *this;
    }

    C& operator=(const C& src) {
        // non-volatile to non-volatile assignment
        assignFrom(src, false, false);
        return *this;
    }
};

Я проверил его, и, похоже, он работает нормально.

...