15 template<
typename Idx,
typename R,
typename Vis,
typename... Vars>
16 struct VisitHelper {};
18 template<
size_t... indices,
typename R,
typename Vis,
typename... Vars>
22 } -> concepts::ImplicitlyConvertibleTo<R>;
24 struct VisitHelper<meta::List<Constexpr<indices>...>, R, Vis, Vars...> {
25 constexpr static auto call(Vis&& visitor, Vars&&... variants) -> R {
32template<
typename R,
typename Vis, concepts::VariantLike... Vars,
33 typename Indices = meta::CartesianProduct<meta::AsList<meta::MakeIndexSequence<meta::VariantSize<Vars>>>...>>
35 []<concepts::TypeList... Idx>(meta::List<Idx...>) {
36 return Array { (&detail::VisitHelper<Idx, R, Vis, Vars...>::call)... };
39constexpr auto visit(Vis&& visitor, Vars&&... variants) -> R {
41 return Array { (&detail::VisitHelper<Idx, R, Vis, Vars...>::call)... };
47#pragma GCC diagnostic push
48#pragma GCC diagnostic ignored "-Warray-bounds"
52#pragma GCC diagnostic pop
55 return f(util::forward<Vis>(visitor), util::forward<Vars>(variants)...);
60constexpr auto visit(Vis&& visitor, Vars&&... variants) ->
decltype(
auto)
61requires(
requires {
visit<R>(util::forward<Vis>(visitor), util::forward<Vars>(variants)...); })
63 return visit<R>(util::forward<Vis>(visitor), util::forward<Vars>(variants)...);
Definition variant_like.h:37
constexpr auto invoke
Definition invoke.h:100
constexpr auto invoke_r
Definition invoke.h:103
container::Vector< Value > Array
Definition json_value.h:59
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto variant_index
Definition variant_index.h:27
constexpr auto visit(Vis &&visitor, Vars &&... variants) -> R
Definition visit.h:39
Definition any_storable.h:9
constexpr auto visit(Vis &&visitor, Vars &&... variants) -> R
Definition visit.h:39