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

C++ - Checking all member variables for condition

我的情况的简化示例:

我有一个 class 有 3 个成员变量,都是整数,例如

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

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

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

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

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

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

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

  2. 偶尔会在这个class中加入新的成员变量(例如int D)。

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

  4. 此外,由于这个项目太大,上面的all_zero功能很容易被忽略(即有人可能忘记或完全不知道将&& D == 0添加到如果添加了一个新的成员变量函数)。

综上所述...这是我的问题:

有什么方法可以修改这个 all_zero 函数,让它总是检查 所有 成员变量(int 类型),而不需要告诉明确检查每一个的功能?顺便说一句,如果此功能是在 class 之外完成的(而不是在 class 内部使用成员函数),我也可以接受。

我希望我不必求助于此,但对我来说最糟糕的情况是我可以坚持上面的这个原始 all_zero 想法,只是将添加新成员程序化这个class的变量,基本上告诉任何人向class添加成员变量也必须手动修改这个all_zero函数。

bool all_zero() const
{
   Foo f{}, g{};
   g = *this;  
   return ::memcmp(&f, &g, sizeof(f));
}

是一种方式,假设您的 class 是 可简单复制的 {} 将零初始化成员 ,包括任何填充位 ,编译器生成的赋值运算符将复制成员以进行比较。

我们很可能很快就会得到编译器生成的 ==,这可能会更好。参见 https://isocpp.org/blog/2016/02/a-bit-of-background-for-the-default-comparison-proposal-bjarne-stroustrup

最后,如果比较方法需要在class之外,那就考虑

bool all_zero(const Foo& f)
{
    Foo g{}, h{};
    h = f;
    return ::memcmp(&g, &h, sizeof(f));
}