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

Ima*_*889 6 c++ class member

我的情况的简化示例:

我有一个有3个成员变量的类,所有整数,例如

class Foo
{
   public:
      int A;
      int B;
      int C;
};
Run Code Online (Sandbox Code Playgroud)

我希望有一个函数,true如果所有成员变量都是0,false则返回一个布尔值,否则.

很容易,可以用这个成员函数完成:

bool all_zero()
{
   return (A == 0 && B == 0 && C == 0);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  2. 有时,会将新成员变量添加到此类(例如int D).

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

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

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

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

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

Bat*_*eba 5

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

是一种方式,假设你的班级是可以轻易复制的.的{}意愿零初始化部件包括任何填充比特,并且编译器生成的赋值运算符将成员复制进行比较.

很可能我们很快就会得到一个编译器生成的==,这可能会更好.请参阅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));
}
Run Code Online (Sandbox Code Playgroud)

  • 我正在考虑是否可能在末尾填充.如果有填充,则其内容未指定.它可能最终会给出假阴性. (8认同)
  • 我讨厌*那个人*,但它是倒退的.[C++帐号填充](https://timsong-cpp.github.io/cppwp/n4659/dcl.init#6.2).虽然[C ...没那么多](http://port70.net/~nsz/c/c11/n1570.html#note310). (2认同)