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

标签 c++ c++03

<分区>

我有一个跟进问题:

Initializing default values in a struct

我有一个已经有 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 = {};
}

关于c++ - 如何在添加成员时维护结构的初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33698884/

相关文章:

c++ - 非模板类的模板子类 - 未解析的外部

c++ - 似乎无法从此文件中获取行数

c++ - 使用静态类变量而不分配它们

c++ - C++ 代码可以在 C++03 和 C++11 中都有效但做不同的事情吗?

c++ - 打印出基类和继承类的内存内容

c++ - 沿枚举 C++ 返回变量类型

c++ - 使用分支启动函数

c++ - 具有 const 成员的结构 vector ?

c++ - 将非空终止 c 字符串转换为终止 c 字符串的最干净方法

c++ - 如何在 Mac OSX El Capitan 上替换 boost/thread/tss.hpp?