如何在添加成员时维护结构的初始化?

How to maintain initialization of struct as members are added?

我有一个跟进问题:

Initializing default values in a struct

我有一个已经有 17 个布尔值的结构,以及一个将它们全部设置为 falseclear() 方法。这是一个长期项目;该代码可能在多年后仍在使用并被添加到。有没有办法初始化所有将自动扩展的成员,以便向结构添加新成员的人不需要记住将它们添加到 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" 值。

这里的结构不合适。