#pragma once #include "variant.h" namespace meta { namespace detail { template struct variant_helper; template struct variant_helper> { static constexpr auto ConstructJT() { using T = std::variant; return std::array { []() -> T { return Ts{}; } ... }; } }; } template typename Template, typename ...Ts> struct variant_wrap , Template> { using type = std::variant...>; }; template struct tuple_to_variant > { using type = std::variant; }; template constexpr auto variant_construct(size_t i) noexcept { constexpr auto jt = detail::variant_helper::ConstructJT(); return jt[i](); } template struct index_in_variant> { static constexpr uint8_t value = 0; }; template struct index_in_variant> { static constexpr uint8_t value = 0; }; template struct index_in_variant> { static constexpr uint8_t value = index_in_variant>::value + 1; }; }