我有一个问题,这是一个后续问题:
初始化结构中的默认值
我有一个已经有17个bool的结构,以及一个将它们全部设置为false
的clear()
方法。这是一个长期项目;该代码可能在几年后仍在使用,并被添加到中。有没有一种方法可以初始化所有将自动扩展的成员,这样向结构添加新成员的人就不需要记住将它们添加到clear()
方法中(而不是注释"请不要忘记")?
这个代码库现在不是C++11,所以我认为我不能在声明中初始化。
代码如下:
typedef struct {
bool doThingA;
bool doThingB;
bool doThingC;
bool doThingD;
// etc for several more bools
void clear() {
doThingA = false;
doThingB = false;
doThingC = false;
doThingD = false;
// etc...
}
} EnableFlags;
struct EnableFlags {
bool doThingA;
bool doThingB;
bool doThingC;
bool doThingD;
// etc for several more bools
void clear() {
*this = EnableFlags();
}
};
这将创建一个临时的,所有成员都设置为零,然后使*this
成为它的副本。因此,无论有多少成员,它都将所有成员设置为零。
这假设您没有定义一个默认构造函数,该构造函数除了将所有标志设置为false之外,还可以执行其他操作。如果没有用户定义的构造函数,那么这个假设成立。
由于C++11,它甚至更简单:
void clear() {
*this = {};
}
一个选项是使用关于clear
函数内部结构大小的静态断言。
首先确定结构的当前大小。假设是68。然后,添加以下内容:
void clear()
{
BOOST_STATIC_ASSERT(sizeof(EnableFlags) == 68 && "You seem to have added a data member. Clear it before changing the number 68 to match current struct size!!");
// the rest as before ...
}
我已经使用了Boost的静态断言宏,但您可以使用任何其他您想要的宏,也可以推出自己的宏。
有了这样的断言,当结构的大小发生变化时,代码将无法编译。这不是一个包罗万象的解决方案,但确实提供了一种保障。
只需使用对象。
因此,您可以使用"for"循环来检查std::向量的值是false还是true。
因此,你不会让你的未来同事每次创建一个新的布尔变量时都输入"false"值。
这里的结构不合适。