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

时间:2018-01-25 12:47:34

标签: c++ class member

我情况的简化示例:

我有一个包含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函数成员变量已添加)。

  5. 所有这些......这是我的问题:

    有没有办法修改这个all_zero函数,以便它总是检查所有成员变量(int类型),而无需告诉函数明确检查每一个?顺便说一句,如果这个功能是在类之外完成的(而不是在带有成员函数的类中),我也很好。

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

1 个答案:

答案 0 :(得分:5)

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));
}