22 template<
typename... Bases>
26 : std::decay_t<Bases> { std::forward<Bases> (bases) }...
30 using std::decay_t<Bases>::operator()...;
34 template<
typename... Vars,
typename... Args>
35 decltype (
auto)
Visit (
const std::variant<Vars...>& v, Args&&... args)
37 return std::visit (
Overloaded { std::forward<Args> (args)... }, v);
40 template<
typename... Vars,
typename... Args>
41 decltype (
auto)
Visit (std::variant<Vars...>& v, Args&&... args)
43 return std::visit (
Overloaded { std::forward<Args> (args)... }, v);
46 template<
typename... Vars,
typename... Args>
47 decltype (
auto)
Visit (std::variant<Vars...>&& v, Args&&... args)
49 return std::visit (
Overloaded { std::forward<Args> (args)... }, std::move (v));
57 template<
typename FinallyFunc,
typename... Args>
65 : Base_ { std::forward<Args> (args)... }
70 : Base_ { std::forward<Args> (args)... }
71 , Finally_ { std::forward<FinallyFunc> (func) }
78 if constexpr (std::is_same_v<FinallyFunc, Void>)
79 return Visit (var, Base_);
83 return Visit (var, Base_);
94 template<
typename... Args>
97 template<
typename T,
typename... Args>
100 return detail::VisitorBase<Args...> { std::forward<Args> (args)... } (std::forward<T> (t));
Visitor(detail::VisitorFinallyTag, Args &&... args, FinallyFunc &&func)
decltype(auto) operator()(const T &var) const
Visitor< F, detail::VisitorBase< Args... > > Finally(F &&func)
detail::ScopeGuard< F > MakeScopeGuard(const F &f)
Returns an object performing passed function on scope exit.
auto InvokeOn(T &&t, Args &&... args)
auto Visit(const Either< Left, Right > &either, Args &&... args)
Visitor(Args &&...) -> Visitor< Void, Args... >
A proper void type, akin to unit (or ()) type in functional languages.
VisitorBase(Bases &&... bases)