我情况的简化示例:
我有一个包含3个成员变量的类,所有整数,例如
class Foo
{
public:
int A;
int B;
int C;
};
我希望有一个函数,如果所有成员变量都为0,则返回布尔true
,否则返回false
。
足够简单,可以使用此成员函数完成:
bool all_zero()
{
return (A == 0 && B == 0 && C == 0);
}
如果有必要,我可以这样做。
然而,这在我的情况下并不理想,因为:
我不是唯一管理此软件的人。
有时会将新成员变量添加到此类中(例如int D
)。
这是一个非常大的C ++项目,我们通常不会通过手动修改代码直接向类添加新的成员变量 - 而是我们有自动修改代码的自定义工具。因此,我们很少对这个类进行手动修改。
此外,由于此项目太大,上面的all_zero
函数很容易被忽略(即有人可能会忘记,或者完全不知道如果新增&& D == 0
函数成员变量已添加)。
所有这些......这是我的问题:
有没有办法修改这个all_zero
函数,以便它总是检查所有成员变量(int
类型),而无需告诉函数明确检查每一个?顺便说一句,如果这个功能是在类之外完成的(而不是在带有成员函数的类中),我也很好。
我希望我不必诉诸于此,但对我来说,最糟糕的情况是我可以坚持上面这个原始的all_zero
想法并且只是程序化添加一个新的成员变量到这个类,基本上告诉任何向类添加成员变量的人也必须手动修改这个all_zero
函数。
答案 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));
}