21 template<
typename... Bases>
25 :
std::decay_t<Bases> { std::forward<Bases> (bases) }...
29 using std::decay_t<Bases>::operator()...;
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)
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>
Visitor< F, detail::VisitorBase< Args... > > Finally(F &&func)
Visitor(const detail::VisitorFinallyTag &, Args &&... args, FinallyFunc &&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)
A proper void type, akin to unit (or ()) type in functional languages.
VisitorBase(Bases &&... bases)