42 template<
typename... Bases>
43 struct VisitorBase : std::decay_t<Bases>...
46 : std::decay_t<Bases> { std::forward<Bases> (bases) }...
50 using std::decay_t<Bases>::operator()...;
53 template<
class... Ts>
struct Overloaded : Ts...
55 using Ts::operator()...;
60 template<
typename... Vars,
typename... Args>
61 decltype (
auto)
Visit (const std::variant<Vars...>& v, Args&&... args)
66 template<
typename... Vars,
typename... Args>
67 decltype (
auto)
Visit (std::variant<Vars...>& v, Args&&... args)
74 struct VisitorFinallyTag {};
77 template<
typename FinallyFunc,
typename... Args>
80 detail::VisitorBase<Args...> Base_;
85 : Base_ { std::forward<Args> (args)... }
89 Visitor (
const detail::VisitorFinallyTag&, Args&&... args, FinallyFunc&& func)
90 : Base_ { std::forward<Args> (args)... }
91 , Finally_ { std::forward<FinallyFunc> (func) }
96 decltype (
auto) operator() (const T& var)
const
98 if constexpr (std::is_same_v<FinallyFunc, Void>)
99 return Visit (var, Base_);
103 return Visit (var, Base_);
110 return { detail::VisitorFinallyTag {}, std::move (Base_), std::forward<F> (func) };
114 template<
typename... Args>
117 template<
typename T,
typename... Args>