Я обновляю мою структуру, и я хотел добавить к ней член std :: string. Оригинальный структура выглядит следующим образом:Анонимный союз C++ 11 с нетривиальными членами
struct Value {
uint64_t lastUpdated;
union {
uint64_t ui;
int64_t i;
float f;
bool b;
};
};
Просто добавив элемент станд :: строковое объединение, конечно, вызывает ошибку компиляции, потому что один обычно нужно добавить нетривиальные конструкторы объекта. 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.
Затем сайт продолжает давать следующий код:
union U
{
int a;
int b;
string s;
U();
~U();
};
Однако я использую анонимный союз в структуры. Я спросил ## C++ на Freenode, и они сказали мне правильный способ сделать это было положить конструктор в структуры вместо и дал мне этот пример кода:
#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)
{
}
Но оттуда я не могу понять, как сделайте остальные специальные функции, определенные std :: string, и, кроме того, я не совсем понимаю, как работает ctor в этом примере.
Могу ли я заставить кого-то объяснить это мне немного яснее?
Мне кажется, что вам действительно нужен [вариант] (http://www.boost.org/libs/variant/) ... – ildjarn
У меня уже есть вариантный класс, который я использую в другом месте , Я не использую его в этом экземпляре, потому что это для сериализованных данных по сети, и я хотел, чтобы данные были небольшими, поэтому все, что Вариант сохраняет внутри (например, ввод информации) классу, который я хотел сохранить внешним, и решить что на основе схемы пакетов. – OmnipotentEntity