@@ -169,6 +169,9 @@ namespace std {
169
169
template <class Visitor, class... Variants>
170
170
constexpr see below visit(Visitor&&, Variants&&...);
171
171
172
+ template <class R, class Visitor, class... Variants>
173
+ constexpr R visit(Visitor&&, Variants&&...); // since C++20
174
+
172
175
// 20.7.7, class monostate
173
176
struct monostate;
174
177
@@ -583,6 +586,16 @@ struct __variant {
583
586
__make_value_visitor (_VSTD::forward<_Visitor>(__visitor)),
584
587
_VSTD::forward<_Vs>(__vs)...);
585
588
}
589
+ #if _LIBCPP_STD_VER > 17
590
+ template <class _Rp , class _Visitor , class ... _Vs>
591
+ inline _LIBCPP_INLINE_VISIBILITY
592
+ static constexpr _Rp __visit_value (_Visitor&& __visitor,
593
+ _Vs&&... __vs) {
594
+ return __visit_alt (
595
+ __make_value_visitor<_Rp>(_VSTD::forward<_Visitor>(__visitor)),
596
+ _VSTD::forward<_Vs>(__vs)...);
597
+ }
598
+ #endif
586
599
587
600
private:
588
601
template <class _Visitor , class ... _Values>
@@ -605,12 +618,43 @@ private:
605
618
_Visitor&& __visitor;
606
619
};
607
620
621
+ #if _LIBCPP_STD_VER > 17
622
+ template <class _Rp , class _Visitor >
623
+ struct __value_visitor_return_type {
624
+ template <class ... _Alts>
625
+ inline _LIBCPP_INLINE_VISIBILITY
626
+ constexpr _Rp operator ()(_Alts&&... __alts) const {
627
+ __std_visit_exhaustive_visitor_check<
628
+ _Visitor,
629
+ decltype ((_VSTD::forward<_Alts>(__alts).__value ))...>();
630
+ if constexpr (is_void_v<_Rp>) {
631
+ _VSTD::__invoke_constexpr (_VSTD::forward<_Visitor>(__visitor),
632
+ _VSTD::forward<_Alts>(__alts).__value ...);
633
+ }
634
+ else {
635
+ return _VSTD::__invoke_constexpr (_VSTD::forward<_Visitor>(__visitor),
636
+ _VSTD::forward<_Alts>(__alts).__value ...);
637
+ }
638
+ }
639
+
640
+ _Visitor&& __visitor;
641
+ };
642
+ #endif
643
+
608
644
template <class _Visitor >
609
645
inline _LIBCPP_INLINE_VISIBILITY
610
646
static constexpr auto __make_value_visitor (_Visitor&& __visitor) {
611
647
return __value_visitor<_Visitor>{_VSTD::forward<_Visitor>(__visitor)};
612
648
}
649
+
650
+ #if _LIBCPP_STD_VER > 17
651
+ template <class _Rp , class _Visitor >
652
+ inline _LIBCPP_INLINE_VISIBILITY
653
+ static constexpr auto __make_value_visitor (_Visitor&& __visitor) {
654
+ return __value_visitor_return_type<_Rp, _Visitor>{_VSTD::forward<_Visitor>(__visitor)};
655
+ }
613
656
};
657
+ #endif
614
658
615
659
} // namespace __visitation
616
660
@@ -1594,18 +1638,37 @@ constexpr bool operator>=(const variant<_Types...>& __lhs,
1594
1638
template <class _Visitor , class ... _Vs>
1595
1639
inline _LIBCPP_INLINE_VISIBILITY
1596
1640
_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
1597
- constexpr decltype (auto ) visit(_Visitor&& __visitor, _Vs&&... __vs) {
1598
- using __variant_detail::__visitation::__variant;
1599
- bool __results[] = {__vs.valueless_by_exception ()...};
1600
- for (bool __result : __results) {
1601
- if (__result) {
1641
+ constexpr void __throw_if_valueless (_Visitor&& __visitor, _Vs&&... __vs) {
1642
+ const bool __valueless = (... || __vs.valueless_by_exception ());
1643
+ if (__valueless) {
1602
1644
__throw_bad_variant_access ();
1603
- }
1604
1645
}
1646
+ }
1647
+
1648
+ template <class _Visitor , class ... _Vs>
1649
+ inline _LIBCPP_INLINE_VISIBILITY
1650
+ _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
1651
+ constexpr decltype (auto ) visit(_Visitor&& __visitor, _Vs&&... __vs) {
1652
+ using __variant_detail::__visitation::__variant;
1653
+ _VSTD::__throw_if_valueless (_VSTD::forward<_Visitor>(__visitor),
1654
+ _VSTD::forward<_Vs>(__vs)...);
1605
1655
return __variant::__visit_value (_VSTD::forward<_Visitor>(__visitor),
1606
1656
_VSTD::forward<_Vs>(__vs)...);
1607
1657
}
1608
1658
1659
+ #if _LIBCPP_STD_VER > 17
1660
+ template <class _Rp , class _Visitor , class ... _Vs>
1661
+ inline _LIBCPP_INLINE_VISIBILITY
1662
+ _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
1663
+ constexpr _Rp visit (_Visitor&& __visitor, _Vs&&... __vs) {
1664
+ using __variant_detail::__visitation::__variant;
1665
+ _VSTD::__throw_if_valueless (_VSTD::forward<_Visitor>(__visitor),
1666
+ _VSTD::forward<_Vs>(__vs)...);
1667
+ return __variant::__visit_value<_Rp>(_VSTD::forward<_Visitor>(__visitor),
1668
+ _VSTD::forward<_Vs>(__vs)...);
1669
+ }
1670
+ #endif
1671
+
1609
1672
struct _LIBCPP_TEMPLATE_VIS monostate {};
1610
1673
1611
1674
inline _LIBCPP_INLINE_VISIBILITY
0 commit comments