C++ - 检查所有成员变量的条件
C++ - Checking all member variables for condition
我的情况的简化示例:
我有一个包含 3 个成员变量的类,都是整数,例如
class Foo
{
public:
int A;
int B;
int C;
};
我想要一个函数,如果所有成员变量都为 0,则返回布尔true
,否则false
。
很简单,可以用这个成员函数完成:
bool all_zero()
{
return (A == 0 && B == 0 && C == 0);
}
如有必要,我可以这样做。
但是,这在我的情况下并不理想,因为:
我不是唯一管理这个软件的人。
有时,新的成员变量被添加到此类中(例如
int D
)。这是一个非常大的C++项目,我们通常不会通过手动修改代码直接向类添加新的成员变量 - 相反,我们有自动为我们修改代码的自定义工具。因此,我们很少对此类进行手动修改。
此外,由于这个项目非常大,上面的
all_zero
函数很容易被忽略(即,如果添加了一个新的成员变量,有人可能会忘记,或者完全不知道向函数添加&& D == 0
)。
话虽如此...这是我的问题:
有没有办法修改这个all_zero
函数,使其始终检查所有成员变量(int
类型),而无需告诉函数显式检查每个成员变量?顺便说一下,如果此功能是在类外部完成的(而不是在具有成员函数的类内部),我也可以。
我希望我不必求助于这个,但对我来说最坏的情况是,我可以坚持上面的原始all_zero
想法,只是将新成员变量添加到该类的程序化,基本上告诉任何向类添加成员变量的人也必须手动修改此all_zero
函数。
bool all_zero() const
{
Foo f{}, g{};
g = *this;
return ::memcmp(&f, &g, sizeof(f));
}
是一种方式,假设您的类是微不足道的可复制的。{}
将对成员(包括任何填充位)进行零初始化,编译器生成的赋值运算符将复制成员进行比较。
很可能我们很快就会得到一个编译器生成的==
,这可能会更好。请参阅 https://isocpp.org/blog/2016/02/a-bit-of-background-for-the-default-comparison-proposal-bjarne-stroustrup。
最后,如果比较方法需要在类外,则考虑
bool all_zero(const Foo& f)
{
Foo g{}, h{};
h = f;
return ::memcmp(&g, &h, sizeof(f));
}
- 基于模板值的条件变量
- 没有超时的C++条件变量
- 在条件变量中触发错误信号的频率是多少
- 使用不变量来确定二分搜索中的边界条件
- 在通知提升间处理条件变量时未按住锁会导致问题
- 通知条件变量后使用互斥锁
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 滥用条件变量
- 升压插值条件变量可以虚假唤醒吗?
- 根据模板类型有条件地删除变量
- 子线程中的条件变量等待停止主线程中的执行
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 条件变量基本示例
- 正在连接的等待条件变量的线程会发生什么情况?
- C++11如何在1个线程中使用条件变量处理2个线程安全队列
- 当线程处理不同的类时,应该在哪里声明条件变量、互斥对象
- 为什么在同一条件变量上使用多个互斥锁会使此代码崩溃?
- 条件变量:wait_for.gcc错误
- 如何"stop"正在等待条件变量的分离线程?
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取