如何在添加成员时保持struct的初始化?

时间:2015-11-13 17:49:49

标签: c++ c++03

我有一个问题是对此的跟进:

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;

3 个答案:

答案 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'循环来检查它。

所以你没有让你的未来同事每次创建一个新的布尔变量时都会输入“假”值。

这里的结构是无用的。