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



我有一个问题,这是一个后续问题:

初始化结构中的默认值

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

这里的结构不合适。

最新更新