检查工会平等

时间:2014-01-13 16:18:33

标签: c++ equality unions

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==的实施似乎相当昂贵且令人费解。这是检查具有联合类型的类中的相等性的唯一方法吗?

还是有更好的方法可以避免分支/检查其他变量吗?

4 个答案:

答案 0 :(得分:3)

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

使用最少的检查次数清除和调试。你想拥有一个构造函数和/或set方法来确保isFloat始终是正确的。

答案 1 :(得分:1)

您可以删除一个冗余检查,并通过用

替换最后两行来略微提高可读性
if(isFloat != mS.isFloat) return false; // As you have
return isFloat ? mS.k == k : mS.n == n;

(或等效的if构造,如Sean Perry的回答)但编译器可能在优化版本方面做得很好。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我认为你不能逃避检查所有条件。所以问题可能是如何更简单,更有表现力地写出它们。

我会按照以下方式写它们

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