假设我有一个同时具有 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/