21 template<
typename... Bases>
22 struct VisitorBase : std::decay_t<Bases>...
25 : std::decay_t<Bases> { std::forward<Bases> (bases) }...
29 using std::decay_t<Bases>::operator()...;
32 template<
class... Ts>
struct Overloaded : Ts...
34 using Ts::operator()...;
39 template<
typename... Vars,
typename... Args>
40 decltype (
auto)
Visit (const std::variant<Vars...>& v, Args&&... args)
45 template<
typename... Vars,
typename... Args>
46 decltype (
auto)
Visit (std::variant<Vars...>& v, Args&&... args)
53 struct VisitorFinallyTag {};
56 template<
typename FinallyFunc,
typename... Args>
64 : Base_ { std::forward<Args> (args)... }
69 : Base_ { std::forward<Args> (args)... }
70 , Finally_ { std::forward<FinallyFunc> (func) }
75 decltype (
auto) operator() (const T& var)
const
77 if constexpr (std::is_same_v<FinallyFunc, Void>)
78 return Visit (var, Base_);
82 return Visit (var, Base_);
93 template<
typename... Args>
96 template<
typename T,
typename... Args>
97 auto InvokeOn (T&& t, Args&&... args)