13 #ifndef RANGES_V3_FUNCTIONAL_OVERLOAD_HPP
14 #define RANGES_V3_FUNCTIONAL_OVERLOAD_HPP
24 #include <range/v3/utility/static_const.hpp>
26 #include <range/v3/detail/prologue.hpp>
53 template<
typename... Args>
54 using invoke = invoke_result_t<T, Args...>;
59 template<
typename... Ts>
68 template<
typename,
typename...>
69 using _result_t = void;
72 template<
typename First,
typename... Rest>
79 RANGES_NO_UNIQUE_ADDRESS
81 RANGES_NO_UNIQUE_ADDRESS
84 template<
typename Qual>
85 using _result_first = detail::_bind_front<meta::invoke<Qual, First>>;
86 template<
typename Qual>
89 template<
typename... Args>
94 template<
typename Qual,
typename... Args>
100 _result_second<Qual>>,
106 : first_(
static_cast<First &&
>(
first))
107 , second_{
static_cast<Rest &&
>(rest)...}
110 template(
typename... Args)(
111 requires invocable<First, Args...>)
112 constexpr _result_t<detail::_id, Args...> operator()(Args &&... args) &&
114 return invoke((First &&) first_, (Args &&) args...);
116 template(
typename... Args)(
117 requires (!invocable<First, Args...>) AND
119 constexpr _result_t<detail::_id, Args...>
operator()(Args &&... args) &&
124 template(
typename... Args)(
125 requires invocable<First &, Args...>)
126 constexpr _result_t<detail::_ref, Args...> operator()(Args &&... args) &
128 return invoke(first_, (Args &&) args...);
130 template(
typename... Args)(
131 requires (!invocable<First &, Args...>) AND
133 constexpr _result_t<detail::_ref, Args...>
operator()(Args &&... args) &
135 return invoke(second_, (Args &&) args...);
138 template(
typename... Args)(
139 requires invocable<First const &, Args...>)
140 constexpr _result_t<detail::_cref, Args...> operator()(Args &&... args)
const &
142 return invoke(first_, (Args &&) args...);
144 template(
typename... Args)(
145 requires (!invocable<First const &, Args...>) AND
147 constexpr _result_t<detail::_cref, Args...>
operator()(Args &&... args)
const &
149 return invoke(second_, (Args &&) args...);
155 template<
typename Fn>
156 constexpr Fn operator()(Fn fn)
const
160 template<
typename... Fns>
161 constexpr
overloaded<Fns...> operator()(Fns... fns)
const
163 return overloaded<Fns...>{
static_cast<Fns &&
>(fns)...};
173 #include <range/v3/detail/epilogue.hpp>
template(typename ActionFn, typename Rng)(concept(invocable_action_closure_)(ActionFn
\concept invocable_action_closure_
CPP_concept invocable
\concept invocable
Definition: concepts.hpp:48
RANGES_INLINE_VARIABLE(detail::to_container_fn< detail::from_range< std::vector >>, to_vector) template< template< typename... > class ContT > auto to(RANGES_HIDDEN_DETAIL(detail
For initializing a container of the specified type with the elements of an Range.
Definition: conversion.hpp:399
typename Fn::template invoke< Args... > invoke
Evaluate the invocable Fn with the arguments Args.
Definition: meta.hpp:541
front< Pair > first
Retrieve the first element of the pair Pair.
Definition: meta.hpp:2251
typename detail::_cond< If >::template invoke< Then, Else > conditional_t
Select one type or another depending on a compile-time Boolean.
Definition: meta.hpp:1148
Definition: overload.hpp:154
Definition: overload.hpp:60