¿Hay alguna manera de hacer un valor de estructura de C ++: inicializar todas las variables de miembro de POD?

Supongamos que tengo una estructura de C ++ que tiene variables miembro POD y no POD:

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

y para que mi progtwig produzca un comportamiento reproducible, quiero tener todas las variables miembro inicializadas en la construcción. Puedo usar una lista de inicializadores para eso:

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

el problema es que tan pronto como necesite cambiar mi estructura y agregar una nueva variable miembro de POD (por ejemplo, bool Bool ) me arriesgo a olvidar agregarlo a la lista de inicializadores. Entonces, la nueva variable miembro no se inicializará en valor durante la construcción de la estructura.

Además, no puedo usar el truco memset() :

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

porque llamar a memset() para sobreescribir las variables de miembro que no son POD ya construidas puede romperlas.

¿Hay alguna forma de imponer la inicialización de valor de todas las variables miembro POD sin agregar explícitamente su inicialización en este caso?

La forma más limpia sería escribir la clase de plantilla initialized automáticamente initialized :

EDITAR: Me doy cuenta ahora que se puede hacer aún más flexible al permitirle declarar initialized . Esto significa que puede declarar la inicialización sin modificar el Struct original. La inicialización predeterminada ‘T ()’ se inspiró en la respuesta de Prasoons.

 template struct initialized { public: initialized() { value = T(); } initialized(T t) { value = t; } initialized(const initialized& 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; }; void Test() { GlorifiedPodStruct s; s.Int = 1; int b = s.Int; int * pointer = &s.Int; initialized s2; } 

Esto comstack, pero puede necesitar más operadores de conversión, manejo de palabras clave como volátiles, etc. Pero se entiende la idea.

Pregunta vinculada aquí

¿Hay alguna forma de imponer la inicialización de valor de todas las variables miembro POD sin agregar explícitamente su inicialización en este caso?

No estoy seguro de si algo así es posible [directamente] o no, pero los siguientes trabajos

 prasoon@prasoon-desktop ~ $ cat check.cpp && clang++ check.cpp && ./a.out #include  struct Struct { std::string String; int Int; bool k; // add add add }; struct InStruct:Struct { InStruct():Struct(){} }; int main() { InStruct i; std::cout<< ik << " " << i.Int << std::endl; } 0 0 prasoon@prasoon-desktop ~ $ 

Puedes agregar una estructura base:

 struct PODStruct { PODStruct(unsinged int count) { memset( this, 0, count);} }; 

Y luego su estructura deriva de esta estructura base, primer lugar si tiene más de una estructura base,

 struct Struct : PODStruct { Struct(); std::string Str; int Int; } Struc::Struct() : PODStruct(sizeof(Struct)) { }