@@ -21,8 +21,8 @@ constexpr decltype(auto) variant_visit(Visitor&& vis, Variant&& var) {
21
21
using R = typename visit_return_type<Visitor&&, Variant&&,
22
22
std::make_index_sequence<size>>::type;
23
23
auto f = [&vis, &var, index = var.index ()](auto && self, auto i) -> R {
24
- // [[assert: &self == &f]]
25
- // [[assert: 0 <= i && i <= size]]
24
+ // [[assert: &self == &f]];
25
+ static_assert ( 0 <= i && i <= size);
26
26
if constexpr (i == size)
27
27
throw std::bad_variant_access ();
28
28
else if (i == index)
@@ -35,23 +35,28 @@ constexpr decltype(auto) variant_visit(Visitor&& vis, Variant&& var) {
35
35
#undef size
36
36
}
37
37
38
- template <class T > struct wrapper { T elem; };
38
+ template <class T , std:: size_t > struct wrapper { T elem; };
39
39
template <class ... Args> struct tuple : Args... {};
40
40
41
- template <class Visitor , class ... Ts>
42
- constexpr decltype (auto ) visit_impl(Visitor&& vis, tuple<wrapper<Ts>...> tpl) {
43
- return static_cast <Visitor&&>(vis)(static_cast <wrapper<Ts>&>(tpl).elem ...);
41
+ template <class I , class Visitor , class ... Ts, std::size_t ... Is>
42
+ constexpr decltype (auto ) visit_impl(I, Visitor&& vis,
43
+ tuple<wrapper<Ts, Is>...> tpl)
44
+ {
45
+ return static_cast <Visitor&&>(vis)(
46
+ static_cast <wrapper<Ts, Is>&>(tpl).elem ...);
44
47
}
45
48
46
- template <class Visitor , class ... Ts, class Variant , class ... Variants>
47
- constexpr decltype (auto ) visit_impl(Visitor&& vis, tuple<wrapper<Ts>...> tpl,
48
- Variant&& var, Variants&&... vars)
49
+ template <class I , class Visitor , class ... Ts, std::size_t ... Is,
50
+ class Variant , class ... Variants>
51
+ constexpr decltype (auto ) visit_impl(I i, Visitor&& vis,
52
+ tuple<wrapper<Ts, Is>...> tpl, Variant&& var, Variants&&... vars)
49
53
{
50
54
auto f = [&vis, &tpl, &vars...](auto && cur) -> decltype (auto ) {
51
55
using T = decltype (cur);
52
- return (visit_impl)(static_cast <Visitor&&>(vis),
53
- tuple<wrapper<Ts>..., wrapper<T>>{
54
- static_cast <wrapper<Ts>&>(tpl)..., { static_cast <T>(cur) }
56
+ return (visit_impl)(std::integral_constant<std::size_t , i + 1 >{},
57
+ static_cast <Visitor&&>(vis),
58
+ tuple<wrapper<Ts, Is>..., wrapper<T, i>>{
59
+ static_cast <wrapper<Ts, Is>>(tpl)..., { static_cast <T>(cur) }
55
60
},
56
61
static_cast <Variants&&>(vars)...);
57
62
};
@@ -62,6 +67,7 @@ template<class Visitor, class Variant, class... Variants>
62
67
constexpr decltype (auto ) variant_visit(Visitor&& vis, Variant&& var,
63
68
Variants&&... vars)
64
69
{
65
- return (visit_impl)(static_cast <Visitor&&>(vis), tuple<>{},
70
+ return (visit_impl)(std::integral_constant<std::size_t , 0 >{},
71
+ static_cast <Visitor&&>(vis), tuple<>{},
66
72
static_cast <Variant&&>(var), static_cast <Variants&&>(vars)...);
67
73
}
0 commit comments