4#ifndef TETL_TYPE_TRAITS_INVOKE_RESULT_HPP
5#define TETL_TYPE_TRAITS_INVOKE_RESULT_HPP
7#include <etl/_type_traits/bool_constant.hpp>
8#include <etl/_type_traits/decay.hpp>
9#include <etl/_type_traits/declval.hpp>
10#include <etl/_type_traits/is_base_of.hpp>
11#include <etl/_type_traits/is_function.hpp>
12#include <etl/_type_traits/is_reference_wrapper.hpp>
13#include <etl/_utility/forward.hpp>
21 template <
typename F,
typename... Args>
22 static auto call(F&& f, Args&&... args) ->
decltype(
etl::forward<F>(f)(
etl::forward<Args>(args)...));
25template <
typename B,
typename MT>
26struct invoke_impl<MT B::*> {
27 template <
typename T,
typename Td = decay_t<T>>
28 requires is_base_of_v<B, Td>
29 static auto get(T&& t) -> T&&;
31 template <
typename T,
typename Td = decay_t<T>>
33 static auto get(T&& t) ->
decltype(t.get());
35 template <
typename T,
typename Td = decay_t<T>>
37 static auto get(T&& t) ->
decltype(*
etl::forward<T>(t));
39 template <
typename T,
typename... Args,
typename MT1>
40 requires is_function_v<MT1>
41 static auto call(MT1 B::* pmf, T&& t, Args&&... args)
42 ->
decltype((invoke_impl::get(
etl::forward<T>(t)).*pmf)(
etl::forward<Args>(args)...));
45 static auto call(MT B::* pmd, T&& t) ->
decltype(invoke_impl::get(
etl::forward<T>(t)).*pmd);
48template <
typename F,
typename... Args,
typename Fd = decay_t<F>>
49auto INVOKE(F&& f, Args&&... args) ->
decltype(invoke_impl<Fd>::call(
etl::forward<F>(f),
etl::forward<Args>(args)...));
51template <
typename AlwaysVoid,
typename,
typename...>
52struct invoke_result { };
54template <
typename F,
typename... Args>
55struct invoke_result<
decltype(
void(detail::INVOKE(declval<F>(), declval<Args>()...))), F, Args...> {
56 using type =
decltype(detail::INVOKE(declval<F>(), declval<Args>()...));
71template <
typename F,
typename... ArgTypes>
76template <
typename F,
typename... ArgTypes>
Definition adjacent_find.hpp:9
Deduces the return type of an INVOKE expression at compile time.
Definition invoke_result.hpp:72
Definition is_reference_wrapper.hpp:15