继承 operator= 和构造函数,但也添加额外的包装器赋值

Inheriting operator= and constructor but also add an extra wrapper assignment

提问人:ZeroZ30o 提问时间:2/16/2023 最后编辑:ZeroZ30o 更新时间:2/17/2023 访问量:78

问:

我有以下结构:

struct Feedback : public TaggedUnion<Feedback1Idx, String>
{
    using TaggedUnion<Feedback1Idx, String>::TaggedUnion;
    using TaggedUnion<Feedback1Idx, String>::operator=;

    bool isError = false;
};

...它继承了 TaggedUnion 的运算符 =,允许我编写以下内容:

Feedback a = Feedback1Idx();
Feedback b = String();
Feedback c = Feedback();
Feedback d = b;

在上面的示例中,我希望 a.isError 为 true,b.isError 为 true,但 c.isError 为 false(和 d.isError 为 true,因为 b.isError 为 true)。 换句话说,每当使用继承的运算符 = 时,我都希望将 .isError 切换为 true。

我怎样才能做到这一点?(无需为我添加到 TaggedUnion 的每个模板参数添加构造函数/赋值运算符<>)

C++ 继承 赋值运算符

评论

3赞 Some programmer dude 2/16/2023
请注意,所有示例均未使用任何重载赋值运算符。它们都是构造函数调用。
0赞 Sam Varshavchik 2/16/2023
您通过定义显式赋值运算符而不是继承一个运算符来实现这一点?
0赞 ZeroZ30o 2/16/2023
@SamVarshavchik 确实,但是将来我会向 TaggedUnion<> 添加更多模板参数,因此如果可能的话,我希望这是自动的。我并不反对定义我自己的运算符,这更多的是关于“我如何以这样一种方式定义它,使其环绕继承的运算符?否则,这意味着每当我向 TaggedUnion 添加参数时,我都必须添加重载<>
0赞 ZeroZ30o 2/16/2023
@Someprogrammerdude 这是真的,但是同样的问题也适用,但使用构造函数而不是赋值运算符。理想情况下,我会为它们定义相同的行为。
0赞 Sam Varshavchik 2/16/2023
那么,您的用户定义的算子是否显式调用?TaggedUnion::operator=

答:

0赞 ZeroZ30o 2/17/2023 #1

我找到了一个简单的解决方案:

struct Feedback : public TaggedUnion<Feedback1Idx, String>
{
    bool isError = false;

    Feedback() = default;

    Feedback(const Feedback& _other) = default;

    template<typename TYPE>
    Feedback(const TYPE& _other)
    : TaggedUnion<Feedback1Idx, String>(_other)
    {
        this->isError = true;
    }

    Feedback& operator=(const Feedback& _other) = default;
    
    template<typename TYPE>
    Feedback& operator=(const TYPE& _other)
    {
        this->isError = true;
        TaggedUnion<Feedback1Idx, String>::operator=(_other);
        return *this;
    }
};

需要注意的一件小事:如果您尝试执行 ,编译器可能会对您大喊大叫,或者其他一些不在继承类型中的类型。Feedback a = int

除此之外,应该一切都很好(测试了一下)。