我的情况的简化示例:
我有一个有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)
如有必要,我可以这样做.
但是,这在我的情况下并不理想,因为:
我不是唯一管理这个软件的人.
有时,会将新成员变量添加到此类(例如int D).
这是一个非常大的C++项目,我们通常不会通过手动修改代码直接向类添加新的成员变量 - 相反,我们有自动修改代码的自定义工具.因此,我们很少对这个类进行手动修改.
另外,由于这个项目太大,all_zero上面的功能很容易被忽略(即&& D == 0如果添加了新的成员变量,有人可能会忘记或完全不知道添加到函数中).
所有这些......这是我的问题:
有没有办法修改这个all_zero函数,以便它总是检查所有成员变量(int类型),而不需要告诉函数显式检查每个?顺便说一句,如果这个功能是在类之外完成的(而不是在带有成员函数的类中),我也可以.
我希望我不必诉诸于此,但对我来说最糟糕的情况是我可以坚持all_zero上面的这个原始想法,只是程序化添加一个新的成员变量到这个类,基本上告诉任何添加的人该类的成员变量也必须手动修改此all_zero函数.
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)
| 归档时间: |
|
| 查看次数: |
576 次 |
| 最近记录: |