c++ - 有没有办法让 C++ 结构值初始化所有 POD 成员变量?

标签 c++ constructor initialization

假设我有一个同时具有 POD 和非 POD 成员变量的 C++ 结构:

struct Struct {
    std::string String;
    int Int;
};

为了让我的程序产生可重现的行为,我想在构造时初始化所有成员变量。我可以为此使用初始化列表:

 Struct::Struct() : Int() {}

问题是一旦我需要更改我的结构并添加一个新的 POD 成员变量(比如 bool Bool),我就有忘记将它添加到初始化列表的风险。那么新的成员变量在结构构造时不会被值初始化。

我也不能使用 memset() 技巧:

Struct::Struct()
{
   memset( this, 0, sizeof( *this ) ); //can break non-POD member variables
}

因为调用 memset() 覆盖已经构造的非 POD 成员变量会破坏这些变量。

在这种情况下,有没有一种方法可以强制对所有 POD 成员变量进行值初始化,而无需显式添加它们的初始化?

最佳答案

最简洁的方法是编写自动初始化的模板类 initialized<T> :

编辑:我意识到现在可以通过允许您声明 initialized<Struct> 来使其更加灵活.这意味着您可以在不修改原始 Struct 的情况下声明初始化.默认初始化 'T()' 的灵感来自于 Prasoons 的回答。

template<class T>  
struct initialized 
{ 
public: 

     initialized() 
        { value = T(); }

    initialized(T t) 
        { value = t; }

    initialized(const initialized<T>& x) 
        { value = x.value; }

    T* operator &() { return &value; } 

     operator T&() { return value; }     

private: 
     T value; 
};


struct PodStruct 
{            
    std::string String;      
    int Int; 
};  


struct GlorifiedPodStruct 
{            
    std::string String;      
    initialized<int> Int; 
};  

void Test()
{
    GlorifiedPodStruct s;
    s.Int = 1;
    int b = s.Int;
    int * pointer = &s.Int;

    initialized<PodStruct> s2;
}

这可以编译,但可能需要更多的转换运算符、处理 volatile 等关键字。但你明白了。

关于c++ - 有没有办法让 C++ 结构值初始化所有 POD 成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3930841/

相关文章:

c# - 南希开始接受请求很慢

c++ - 如何实现构造函数,使其只接受使用 typeid 的输入迭代器?

c++ - 使用 () 创建类的实例

c - 在 C 中初始化 const 变量

c++ - 通过 void* 转换到基地

JavaScript - instanceof 没有按照我的预期进行

c++ - 为什么 C++ 不使用父类构造函数?

c++ - 指向对象的句柄和指针

c++ - 使此代码线程安全的最有效方法是什么?

c++ - 在 `std::future` 中运行循环直到破坏 - 惯用方式?