代码之家  ›  专栏  ›  技术社区  ›  ImaginaryHuman072889

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

  •  6
  • ImaginaryHuman072889  · 技术社区  · 6 年前

    我的情况的简化示例:

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

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

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

    很简单,可以使用此成员函数完成:

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

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

    然而,这在我的情况下并不理想,因为:

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

    2. 偶尔会向此类添加新成员变量(例如。 int D ).

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

    4. 此外,由于该项目规模巨大 all_zero 上述功能很容易被忽视(例如,有人可能会忘记或完全不知道添加 && D == 0 如果添加了新成员变量,则返回函数)。

    所有这些都表明。。。我的问题是:

    有没有办法修改这个 all\u零 使其始终检查 全部的 成员变量(共个) int 类型),而无需告诉函数显式检查每一个?顺便说一下,如果这个功能是在类之外完成的(而不是在具有成员函数的类内部),我也可以。

    我希望我不必求助于此,但对我来说,最糟糕的情况是我可以坚持原作 all\u零 将向此类添加新成员变量的过程化,基本上告诉向类添加成员变量的任何人也必须手动修改 all\u零 作用

    1 回复  |  直到 6 年前
        1
  •  5
  •   Bathsheba    6 年前
    bool all_zero() const
    {
       Foo f{}, g{};
       g = *this;  
       return ::memcmp(&f, &g, sizeof(f));
    }
    

    如果你的班级是 微不足道的可复制 . 这个 {} zero会初始化成员吗 包括任何填充位 ,编译器生成的赋值运算符将复制成员以进行比较。

    很可能我们很快就会生成一个编译器 == 那可能会更好。看见 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));
    }