Вам не нужно изобретать велосипед. Есть пара классов, которые вы можете использовать из стандартной библиотеки:
Как следует из комментариев, variant
- это безопасное от типа объединение предопределенного набора типов данных, которое вы вводите в аргумент шаблонов variant
.
Например, std::variant<int,float,double>
может содержать любое значение типа int
, float
или double
, но ничего больше.
Чтобы использовать сохраненное значение, вы можете использовать шаблон посетителя с функцией std::visit()
. Другие функции позволяют вам узнать, какой из предустановленных типов хранится в переменной (index()
), и извлечь из нее значение (используя get()
). Если вы попытаетесь извлечь значение неправильного типа, функция get()
выдает исключение
- еще одна утилита, которая может содержать разные типы данных. В отличие от variant
, вам не нужно знать типы во время компиляции. По сути, он сохраняет void*
данных с typeinfo
для запоминания своего первоначального типа. Затем вы можете использовать any_cast
, чтобы привести переменную к исходному типу. Как и variant
, при попытке привести к неверному типу выдается исключение.
Эти два класса доступны в C ++ 17. Если эти функции вам недоступны, они также были включены в надстройку (соответственно boost:variant
и boost:any
)
Вы можете хранить набор значений в стандартном контейнере библиотеки, например, в std::vector<std::variant<int,float,double>>
или std::vector<std::any>>
.