39 #include <type_traits>
43 template<
class ... Types>
46 template<
class Callable,
class T>
50 curried_t( Callable && f, T && value )
52 std::is_nothrow_constructible<Callable, Callable &&>,
53 std::is_nothrow_constructible<T, T&&> >::value ) :
54 f( std::forward<Callable>(f) ),
55 value( std::forward<T>(value) )
58 template<
class ... Args>
59 std::result_of_t< Callable&( T&, Args&& ... )>
operator()(Args && ... args) &
61 noexcept( std::declval<Callable&>() ( std::declval<T&>(), std::declval<Args&&>() ... )
65 return std::forward<Callable&>(f)( std::forward<T&>(value), std::forward<Args>(args) ... );
68 template<
class ... Args>
69 std::result_of_t< Callable&&( T&&, Args&& ... )>
operator()(Args && ... args) &&
71 noexcept( std::declval<Callable&&>() ( std::declval<T&&>(), std::declval<Args&&>() ... )
75 return std::forward<Callable&&>(f)( std::forward<T&&>(value), std::forward<Args>(args) ... );
78 template<
class ... Args>
79 std::result_of_t< Callable&( T&, Args&& ... )>
operator()(Args && ... args)
const &
81 noexcept( std::declval<Callable const &>() ( std::declval<T const &>(), std::declval<Args&&>() ... )
85 return std::forward<Callable const &>(f)( std::forward<T const &>(value), std::forward<Args>(args) ... );
96 template<
class Callable,
class ... Args>
99 template<
class Callable,
class ... Args>
100 using result_of_visit_t =
typename result_of_visit<Callable, Args ...>::type;
105 template<
class Callable,
class ... Args>
108 #ifndef VARIANT_IN_DOXYGEN_PARSING
110 template<
class Callable>
113 typedef std::result_of_t< Callable() > type;
116 template<
class Callable,
class ... Args,
class ... Tail>
119 typedef std::common_type_t<
124 template<
class Callable,
class ... Args,
class ... Tail>
127 typedef std::common_type_t<
132 template<
class Callable,
class ... Args,
class ... Tail>
135 typedef std::common_type_t<
140 template<
class Callable,
class Head,
class ... Tail>
145 template<
class Callable>
147 std::integral_constant<
149 noexcept( std::declval<Callable>()() )
152 template<
class Callable,
class Head,
class ... Tail>
156 template<
class Callable,
class ... Args,
class ... Tail>
164 template<
class Callable,
class ... Args,
class ... Tail>
172 template<
class Callable,
class ... Args,
class ... Tail>
180 #endif //VARIANT_IN_DOXYGEN_PARSING
195 template<
class Callable,
class ... Args>
196 result_of_visit_t<Callable&&, Args&& ...>
apply_visitor(Callable && c, Args && ... args)
199 template<class Callable>
203 return std::forward<Callable>(c)();
206 template<
class Callable,
class Head,
class ... Tail>
207 result_of_visit_t<Callable&&, Head&&, Tail&& ...>
apply_visitor(Callable && c, Head && head, Tail && ... tail)
211 [&](
auto && ... args)
213 return std::forward<Callable>(c)( std::forward<Head>(head), std::forward<decltype(args)>(args) ... );
215 std::forward<Tail>(tail) ... );
218 template<
class Callable,
class ... Args,
class ... Tail>
225 return apply_visitor( std::forward<Callable>(c), val, std::forward<Tail>(tail) ... );
231 template<
class Callable,
class ... Args,
class ... Tail>
238 return apply_visitor( std::forward<Callable>(c), std::move(val), std::forward<Tail>(tail) ... );
240 std::move(head).get_storage(),
244 template<
class Callable,
class ... Args,
class ... Tail>
251 return apply_visitor( std::forward<Callable>(c), val, std::forward<Tail>(tail) ... );
257 #endif // VISITOR_HPP
Implements the class variant_storage.
result_of_visit_t< Callable &&, Args &&...> apply_visitor(Callable &&c, Args &&...args) noexcept(is_nothrow_visitable< Callable &&, Args &&...>::value)
Calls the provided Callable with the given Args, replacing the variant args with the actual type...
Determine if a visit operation might throw.
Definition: visitor.hpp:106
std::size_t which() const noexcept
Return the index of the current bound object.
Definition: variant.hpp:566
Definition: relational.hpp:33
A type safe generalized union.
Definition: variant.hpp:65
Compute the result type of a visit.
Definition: visitor.hpp:97
decltype(auto) invoke(Callable &&c, VariantStorage &&v, std::size_t which) noexcept(noexcept(invoke_variant_storage_t{}(std::forward< Callable >(c), std::forward< VariantStorage >(v), which)))
Calls the provided Callable with an element of the supplied variant storage.
Definition: variant_storage.hpp:386