Прочитал несколько статей на Хабре, но они все с уклоном в Хаскель. Я не могу разобраться как хранятся алгебраические типы данных. Вот кусок кода на С++ про это.
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
using var_t = std::variant<int, long, double, std::string>;
std::vector<var_t> vec = {10, 15l, 1.5, "hello"};
for (auto& v: vec) {
std::visit(overloaded {
[](auto arg) { std::cout << arg << ' '; },
[](double arg) { std::cout << std::fixed << arg << ' '; },
[](const std::string& arg) { std::cout << std::quoted(arg) << ' '; },
}, v);
}
Как я понимаю создается какой-то контейнер (переменаня) в которую помещаются указатели на элементы в куче, которые могут быть заранее определенными типами (иначе - ошибка). Я правильно понимаю?