检查工会平等

Checking union equality

本文关键字:检查      更新时间:2023-10-16
struct Something {
    union {
        float k;
        int n;
    };
    bool isFloat;
    bool operator==(const Something& mS)
    {
        if(isFloat != mS.isFloat) return false;
        if(isFloat && mS.k == k) return true;
        if(!isFloat && mS.n == n) return true;
    }
};

我对Something::operator==的实现似乎相当昂贵和复杂。这是检查具有联合类型的类的相等性的唯一方法吗?

或者有没有更好的方法来避免分支/检查其他变量?

bool operator==(const Something& mS)
{
    if (isFloat != mS.isFloat)
    {
        return false;
    }
    else if (isFloat)
    {
        return mS.k == k;
    }
    else
    {
        return mS.n == n;
    }
}

清晰且可调试,检查次数最少。您希望有一个构造函数和/或设置方法来确保 isFloat 始终正确。

您可以删除一个多余的检查,并且可以通过将最后两行替换为

if(isFloat != mS.isFloat) return false; // As you have
return isFloat ? mS.k == k : mS.n == n;

(或等效的if结构,如肖恩·佩里的回答),但编译器可能会在优化版本方面做得很好。

无法避免运行时检查类型是否匹配。您可以考虑现成的可区分联合类型,例如 Boost.Variant;它不会更有效率,但它可能更容易使用,更不容易出错。

return (isFloat && mS.isFloat && k==mS.k) || (!isFloat && !mS.isFloat && n==mS.n);

我认为您不能逃避检查所有条件。因此,问题可能是如何编写它们更简单,更具表现力。

我会按以下方式编写它们

bool operator==( const Something &mS ) const
{
    return  ( ( isFloat == mS.isFloat ) && ( isFloat ? k == mS.k : n == mS.n ) );
}