如何在添加成员时维护结构的初始化?
How to maintain initialization of struct as members are added?
我有一个跟进问题:
Initializing default values in a struct
我有一个已经有 17 个布尔值的结构,以及一个将它们全部设置为 false
的 clear()
方法。这是一个长期项目;该代码可能在多年后仍在使用并被添加到。有没有办法初始化所有将自动扩展的成员,以便向结构添加新成员的人不需要记住将它们添加到 clear()
方法(除了评论说 "please don't forget" )?
这个代码库此时不是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;
一种选择是使用关于 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 的静态断言宏,但您可以使用任何其他您想要的,或者推出您自己的。
有了这样的断言,当结构的大小发生变化时,代码将无法编译。这不是万能的解决方案,但确实提供了保障。
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 = {};
}
只需使用对象。
因此您可以使用 'for' 循环来检查 std::vector 它们的值是假还是真。
所以你没有让你的 futurs 同事每次创建新的布尔变量时都输入 "false" 值。
这里的结构不合适。
我有一个跟进问题:
Initializing default values in a struct
我有一个已经有 17 个布尔值的结构,以及一个将它们全部设置为 false
的 clear()
方法。这是一个长期项目;该代码可能在多年后仍在使用并被添加到。有没有办法初始化所有将自动扩展的成员,以便向结构添加新成员的人不需要记住将它们添加到 clear()
方法(除了评论说 "please don't forget" )?
这个代码库此时不是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;
一种选择是使用关于 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 的静态断言宏,但您可以使用任何其他您想要的,或者推出您自己的。
有了这样的断言,当结构的大小发生变化时,代码将无法编译。这不是万能的解决方案,但确实提供了保障。
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 = {};
}
只需使用对象。
因此您可以使用 'for' 循环来检查 std::vector 它们的值是假还是真。
所以你没有让你的 futurs 同事每次创建新的布尔变量时都输入 "false" 值。
这里的结构不合适。