C++ - 检查所有成员变量的条件

C++ - Checking all member variables for condition

本文关键字:变量 条件 成员 检查 C++      更新时间:2023-10-16

我的情况的简化示例:

我有一个包含 3 个成员变量的类,都是整数,例如

class Foo
{
public:
int A;
int B;
int C;
};

我想要一个函数,如果所有成员变量都为 0,则返回布尔true,否则false

很简单,可以用这个成员函数完成:

bool all_zero()
{
return (A == 0 && B == 0 && C == 0);
}

如有必要,我可以这样做。

但是,这在我的情况下并不理想,因为:

  1. 我不是唯一管理这个软件的人。

  2. 有时,新的成员变量被添加到此类中(例如int D)。

  3. 这是一个非常大的C++项目,我们通常不会通过手动修改代码直接向类添加新的成员变量 - 相反,我们有自动为我们修改代码的自定义工具。因此,我们很少对此类进行手动修改。

  4. 此外,由于这个项目非常大,上面的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));
}