首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否使用多个签名的相同代码重载赋值运算符?

是否使用多个签名的相同代码重载赋值运算符?
EN

Stack Overflow用户
提问于 2019-10-02 01:25:07
回答 1查看 69关注 0票数 0

假设我有一个C类:

代码语言:javascript
复制
class C {
    int m_i { 0 };
};

现在这个类可以用于非易失性对象和易失性对象:

代码语言:javascript
复制
C x;
volatile C y;

我希望能够分配易失性到非易失性,非易失性到易失性,非易失性到非易失性。所以我重载了C的赋值操作符:

代码语言:javascript
复制
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=函数中的代码?

EN

回答 1

Stack Overflow用户

发布于 2019-10-02 16:40:20

因此,在考虑了一段时间后,这是我能想到的最好的解决方案:

代码语言:javascript
复制
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;
    }
};

我测试了它,它似乎工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58189651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档