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);
}
如有必要,我可以这样做。
但是,这在我的情况下并不理想,因为:
我不是唯一管理此软件的人。
偶尔会在这个class中加入新的成员变量(例如int D
)。
这是一个非常大的 C++ 项目,我们通常不会通过手动修改代码直接向 class 添加新的成员变量 - 相反,我们有自定义工具可以自动为我们修改代码。因此,我们很少手动修改这个 class.
此外,由于这个项目太大,上面的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));
}
我的情况的简化示例:
我有一个 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);
}
如有必要,我可以这样做。
但是,这在我的情况下并不理想,因为:
我不是唯一管理此软件的人。
偶尔会在这个class中加入新的成员变量(例如
int D
)。这是一个非常大的 C++ 项目,我们通常不会通过手动修改代码直接向 class 添加新的成员变量 - 相反,我们有自定义工具可以自动为我们修改代码。因此,我们很少手动修改这个 class.
此外,由于这个项目太大,上面的
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));
}