32 #include <boost/variant.hpp> 45 template<
typename... Bases>
49 :
std::decay_t<Bases> { std::forward<Bases> (bases) }...
53 using std::decay_t<Bases>::operator()...;
56 template<
typename R,
typename... Args>
64 constexpr T
Declval () {
throw "shall not be called"; }
66 template<
typename... Args>
69 template<
typename... Args>
72 template<
typename... Args>
75 template<
typename... Args>
78 template<
typename R,
typename... Args>
81 if constexpr (AllConsts<Args...>)
82 return Declval<std::add_const_t<R>> ();
83 else if constexpr (AllLValueRefs<Args...>)
85 if constexpr (AllConstsWithoutRefs<Args...>)
86 return Declval<std::add_lvalue_reference_t<std::add_const_t<R>>> ();
88 return Declval<std::add_lvalue_reference_t<R>> ();
90 else if constexpr (AllRValueRefs<Args...>)
92 static_assert (!AllConstsWithoutRefs<Args...>,
"const rvalue references are useless");
93 return Declval<std::add_rvalue_reference_t<R>> ();
99 template<
typename R,
typename... Args>
102 template<
typename... Vars,
104 typename Common = std::common_type_t<std::result_of_t<
detail::VisitorBase<Args...> (Vars&)>...>,
109 template<
typename... Vars,
typename... Args>
110 decltype (
auto)
Visit (const
boost::variant<Vars...>& v, Args&&... args)
114 detail::Visitor<R_t, Args...> visitor { std::forward<Args> (args)... };
115 return boost::apply_visitor (visitor, v);
118 template<
typename... Vars,
typename... Args>
119 decltype (
auto)
Visit (
boost::variant<Vars...>& v, Args&&... args)
123 detail::Visitor<R_t, Args...> visitor { std::forward<Args> (args)... };
124 return boost::apply_visitor (visitor, v);
132 template<
typename FinallyFunc,
typename... Args>
137 FinallyFunc Finally_;
140 : Base_ { std::forward<Args> (args)... }
145 : Base_ { std::forward<Args> (args)... }
146 , Finally_ { std::forward<FinallyFunc> (func) }
151 decltype (
auto) operator() (const T& var)
const 153 if constexpr (std::is_same_v<FinallyFunc, Void>)
154 return Visit (var, Base_);
158 return Visit (var, Base_);
169 template<
typename... Args>
172 template<
typename T,
typename... Args>
175 return detail::VisitorBase<Args...> { std::forward<Args> (args)... } (std::forward<T> (t));
decltype(FixCommonType< R, Args... >()) FixCommonType_t
decltype(auto) constexpr FixCommonType()
detail::ScopeGuard< F > MakeScopeGuard(const F &f)
Returns an object performing passed function on scope exit.
constexpr Res DetectCommonType(Typelist< Vars... >, Typelist< Args... >)
VisitorBase(Bases &&... bases)
constexpr bool AllLValueRefs
constexpr bool AllConstsWithoutRefs
constexpr bool AllRValueRefs
auto Visit(const Either< Left, Right > &either, Args &&... args)
Visitor(Args &&...) -> Visitor< Void, Args... >
Visitor(const detail::VisitorFinallyTag &, Args &&... args, FinallyFunc &&func)
auto InvokeOn(T &&t, Args &&... args)
Visitor< F, detail::VisitorBase< Args... > > Finally(F &&func)