3#ifndef TETL_TYPE_TRAITS_INVOKE_RESULT_HPP
4#define TETL_TYPE_TRAITS_INVOKE_RESULT_HPP
20 template <
typename F,
typename... Args>
24template <
typename B,
typename MT>
25struct invoke_impl<MT B::*> {
26 template <
typename T,
typename Td = decay_t<T>>
28 static auto get(T&& t) -> T&&;
30 template <
typename T,
typename Td = decay_t<T>>
32 static auto get(T&& t) ->
decltype(t.get());
34 template <
typename T,
typename Td = decay_t<T>>
38 template <
typename T,
typename... Args,
typename MT1>
40 static auto call(MT1 B::* pmf, T&& t, Args&&... args)
44 static auto call(MT B::* pmd, T&& t) ->
decltype(invoke_impl::get(
etl::forward<T>(t)).*pmd);
47template <
typename F,
typename... Args,
typename Fd =
decay_t<F>>
50template <
typename AlwaysVoid,
typename,
typename...>
51struct invoke_result { };
53template <
typename F,
typename... Args>
54struct invoke_result<decltype(void(detail::INVOKE(declval<F>(), declval<Args>()...))), F, Args...> {
70template <
typename F,
typename... ArgTypes>
75template <
typename F,
typename... ArgTypes>
typename invoke_result< F, ArgTypes... >::type invoke_result_t
Definition invoke_result.hpp:76
Definition adjacent_find.hpp:8
constexpr bool is_base_of_v
Definition is_base_of.hpp:39
auto declval() noexcept -> add_rvalue_reference_t< T >
typename etl::decay< T >::type decay_t
Definition decay.hpp:32
constexpr auto get(complex< X > &z) noexcept -> X &
Definition complex.hpp:92
constexpr bool is_function_v
Checks whether T is a function type. Types like etl::inplace_function, lambdas, classes with overload...
Definition is_function.hpp:35
constexpr auto forward(remove_reference_t< T > ¶m) noexcept -> T &&
Forwards lvalues as either lvalues or as rvalues, depending on T. When t is a forwarding reference (a...
Definition forward.hpp:18
static constexpr bool value
Definition integral_constant.hpp:10
Deduces the return type of an INVOKE expression at compile time.
Definition invoke_result.hpp:71