Конструктор и экземпляр-конструктор для класса, содержащего объединение с нетривиальными членами
Я пытаюсь реализовать пользовательский тип варианта, который использует объединение для хранения данных различных типов. В полеtype_id
Я планирую хранить данные какого типа хранятся в объединении. Союз содержит нетривиальных членов. Вот моя текущая реализация:
struct MyVariant {
enum { t_invalid, t_string, t_int, t_double, t_ptr, t_dictionary } type_id;
union {
int as_int;
double as_double;
std::string as_string;
std::unique_ptr<int> as_ptr;
std::map<int, double> as_dictionary;
};
};
Я пытаюсь создать экземплярMyVariant
как следует:
MyVariant v;
Я получаю сообщение об ошибке:Вызов неявно удаленного конструктора по умолчанию MyVariant, Итак, я попытался реализовать конструктор вручную следующим образом:
MyVariant() : type_id{t_int}, as_int{0} {}
Это дает мне похожее сообщение об ошибке:Попытка использовать удаленную функцию, Далее я попытался реализовать следующий конструктор:
MyVariant(int value) : type_id{t_int}, as_int{value} {}
и построить мой экземпляр следующим образом:
MyVariant v{123};
=> то же сообщение об ошибке:Попытка использовать удаленную функцию.
Я также начал реализовывать конструктор копирования, это выглядит следующим образом. Однако, конечно, это не помогает с ошибками компилятора.
MyVariant::MyVariant(const MyVariant& other)
{
type_id = other.type_id;
switch (type_id) {
case t_invalid:
break;
case t_string:
new (&as_string) std::string();
as_string = other.as_string;
break;
case t_int:
as_int = other.as_int;
break;
case t_double:
as_double = other.as_double;
break;
case t_ptr:
new (&as_ptr) std::unique_ptr<int>(nullptr);
as_ptr = std::make_unique<int>(*other.as_ptr);
break;
case t_dictionary:
new (&as_dictionary) std::map<int, double>();
// TODO: copy values from other
break;
}
}
Я использую Xcode и Apple LLVM 6.1 в качестве компилятора.
Основной вопрос: почему я получаю ошибки компилятора, которые я получаю, и как я должен изменить свой код, чтобы он компилировался?
Дополнительный вопрос: я в правильном направлении с моими реализациями для конструктора и конструктора копирования?