检查工会平等
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 ) );
}
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- 清除前检查矢量
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- C++LDAP检查用户是否是特定组的成员
- 检查TCHAR数组输入是否为带符号整数C++
- 用概念检查属性的类型