Estoy actualizando una estructura mía y quería agregarle un miembro std :: string. La estructura original están presentes:C++ 11 unión anónima con miembros no triviales
struct Value {
uint64_t lastUpdated;
union {
uint64_t ui;
int64_t i;
float f;
bool b;
};
};
Simplemente añadiendo un miembro std :: string a la unión, por supuesto, provoca un error de compilación, ya que normalmente se necesita añadir los constructores no triviales del objeto. In the case of std::string (text from informit.com)
Since std::string defines all of the six special member functions, U will have an implicitly deleted default constructor, copy constructor, copy assignment operator, move constructor, move assignment operator and destructor. Effectively, this means that you can't create instances of U unless you define some, or all of the special member functions explicitly.
A continuación, el sitio web va a dar el siguiente código de ejemplo:
union U
{
int a;
int b;
string s;
U();
~U();
};
Sin embargo, estoy usando una unión anónima dentro de una estructura. Pregunté ## C++ en freenode y me dijeron que la forma correcta de hacerlo era poner el constructor de la estructura en su lugar y me dio este código de ejemplo:
#include <new>
struct Point {
Point() {}
Point(int x, int y): x_(x), y_(y) {}
int x_, y_;
};
struct Foo
{
Foo() { new(&p) Point(); }
union {
int z;
double w;
Point p;
};
};
int main(void)
{
}
Pero de ahí no puedo entender cómo haga el resto de las funciones especiales que std :: string necesita definir, y además, no estoy del todo claro sobre cómo funciona el ctor en ese ejemplo.
¿Puedo hacer que alguien me explique esto un poco más claro?
Me parece que lo que _really_ necesita es una [variante] adecuada (http://www.boost.org/libs/variant/) ... – ildjarn
Ya tengo una clase de variante que estoy usando en otra parte . No lo estoy usando en este caso, porque esto es para datos serializados en una red y quería mantener los datos pequeños, de modo que todo lo que una Variante mantiene interna (como escribir información) a la clase que quería mantener externa y decidir ¿Qué es lo que se basa en el esquema del paquete? – OmnipotentEntity