#pragma once #include #include template struct heter_array { heter_array() : data(this->default_ctor_impl(std::make_index_sequence{})) {} ~heter_array() = default; heter_array(const heter_array&) = default; heter_array(heter_array&&) = default; heter_array& operator=(const heter_array&) = default; heter_array& operator=(heter_array&&) = default; auto& operator[](size_t i) { return data[i]; } const auto& operator[](size_t i) const { return data[i]; } template decltype(auto) visit(size_t i, F&& f) { return std::visit(std::forward(f), data[i]); } template decltype(auto) visit(size_t i, F&& f) const { return std::visit(std::forward(f), data[i]); } protected: template static auto default_ctor_impl(std::index_sequence) { return std::array{heter_type{std::in_place_index}...}; } using heter_type = std::variant; static constexpr size_t N = sizeof...(Ts); std::array data{}; };