12 #include <type_traits>
14 #define INVOKE_HPP_NOEXCEPT_DECLTYPE_RETURN(...) \
15 noexcept(noexcept(__VA_ARGS__)) -> decltype (__VA_ARGS__) { return __VA_ARGS__; }
25 template <
typename... Args >
31 template <
typename... Args >
41 template <
typename T, T... Ints >
44 static constexpr std::size_t
size() noexcept {
return sizeof...(Ints); }
47 template < std::size_t... Ints >
52 template <
typename T, std::size_t N, T... Ints >
56 template <
typename T, T... Ints >
61 template <
typename T, std::
size_t N >
64 template < std::
size_t N >
67 template <
typename... Ts >
79 template <
typename T >
83 template <
typename U >
88 template <
typename T >
107 typename Base,
typename F,
typename Derived,
110 constexpr
auto invoke_member_object_impl(F Base::* f, Derived&& ref)
112 std::forward<Derived>(ref).*f)
116 typename Base,
typename F,
typename RefWrap,
119 constexpr
auto invoke_member_object_impl(F Base::* f, RefWrap&& ref)
125 typename Base,
typename F,
typename Pointer,
126 typename std::enable_if<
131 constexpr
auto invoke_member_object_impl(F Base::* f, Pointer&& ptr)
133 (*std::forward<Pointer>(ptr)).*f)
141 typename Base,
typename F,
typename Derived,
typename... Args,
144 constexpr
auto invoke_member_function_impl(F Base::* f, Derived&& ref, Args&&... args)
146 (std::forward<Derived>(ref).*f)(std::forward<Args>(args)...))
150 typename Base,
typename F,
typename RefWrap,
typename... Args,
153 constexpr
auto invoke_member_function_impl(F Base::* f, RefWrap&& ref, Args&&... args)
155 (ref.get().*f)(std::forward<Args>(args)...))
159 typename Base,
typename F,
typename Pointer,
typename... Args,
160 typename std::enable_if<
165 constexpr
auto invoke_member_function_impl(F Base::* f, Pointer&& ptr, Args&&... args)
167 ((*std::forward<Pointer>(ptr)).*f)(std::forward<Args>(args)...))
172 typename F,
typename... Args,
175 constexpr
auto invoke(F&& f, Args&&... args)
177 std::forward<F>(f)(std::forward<Args>(args)...))
181 typename F,
typename T,
184 constexpr
auto invoke(F&& f, T&& t)
186 impl::invoke_member_object_impl(std::forward<F>(f), std::forward<T>(t)))
190 typename F,
typename... Args,
193 constexpr
auto invoke(F&& f, Args&&... args)
195 impl::invoke_member_function_impl(std::forward<F>(f), std::forward<Args>(args)...))
208 template <
typename Void,
typename F,
typename... Args >
211 template <
typename F,
typename... Args >
217 template <
typename F,
typename... Args >
221 template <
typename F,
typename... Args >
235 template <
typename Void,
typename R,
typename F,
typename... Args >
237 : std::false_type {};
239 template <
typename R,
typename F,
typename... Args >
242 std::is_void<R>::value,
244 std::is_convertible<invoke_result_t<F, Args...>, R>>
::type {};
247 template <
typename R,
typename F,
typename... Args >
251 template <
typename F,
typename... Args >
263 template <
typename F,
typename Tuple, std::size_t... I >
264 constexpr
auto apply_impl(F&& f, Tuple&& args, index_sequence<I...>)
268 std::get<I>(std::forward<Tuple>(args))...))
271 template <
typename F,
typename Tuple >
272 constexpr
auto apply(F&& f, Tuple&& args)
276 std::forward<Tuple>(args),
280 #undef INVOKE_HPP_NOEXCEPT_DECLTYPE_RETURN