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)
51 template<
typename... Vars,
typename... Args>
52 decltype (
auto)
Visit (std::variant<Vars...>&& v, Args&&... args)
54 return std::visit (
detail::Overloaded { std::forward<Args> (args)... }, std::move (v));
62 template<
typename FinallyFunc,
typename... Args>
70 : Base_ { std::forward<Args> (args)... }
75 : Base_ { std::forward<Args> (args)... }
76 , Finally_ { std::forward<FinallyFunc> (func) }
83 if constexpr (std::is_same_v<FinallyFunc, Void>)
84 return Visit (var, Base_);
88 return Visit (var, Base_);
99 template<
typename... Args>
102 template<
typename T,
typename... Args>
105 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)
Overloaded(Ts...) -> Overloaded< Ts... >
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)