我有一个问题是对此的跟进:
Initializing default values in a struct
我有一个已经有17个bool的结构,以及一个clear()
方法,将它们全部设置为false
。这是一个长期项目;从现在开始,代码仍然可以使用并添加到。有没有办法初始化将自动扩展的所有成员,以便有人向结构添加新成员不需要记住将它们添加到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;
答案 0 :(得分:9)
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 = {};
}
答案 1 :(得分:2)
一种选择是使用关于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的静态断言宏,但你可以使用你想要的任何其他宏,或者推出自己的。
使用这样的断言,当结构的大小发生变化时,代码将无法编译。它不是一个全面的解决方案,但确实提供了保障。
答案 2 :(得分:1)
只需使用objetcs。
因此,如果std :: vector的值为false或true,则可以使用'for'循环来检查它。
所以你没有让你的未来同事每次创建一个新的布尔变量时都会输入“假”值。
这里的结构是无用的。