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==
的实施似乎相当昂贵且令人费解。这是检查具有联合类型的类中的相等性的唯一方法吗?
还是有更好的方法可以避免分支/检查其他变量吗?
答案 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 ) );
}