18
19
20
21
22
25 :
public _impl::fn_traits<std::remove_reference_t<T>> {};
28template <
typename ReturnT,
typename... ArgTs>
30 using return_type = ReturnT;
31 using arg_types = std::tuple<ArgTs...>;
36 struct fn_object_traits;
39 template <
typename ReturnT,
typename ClassT,
typename... ArgTs>
40 struct fn_object_traits<ReturnT (ClassT::*)(ArgTs...)>
44 template <
typename ReturnT,
typename ClassT,
typename... ArgTs>
45 struct fn_object_traits<ReturnT (ClassT::*)(ArgTs...)
const>
51 requires requires { &T::operator(); }
53 :
public fn_object_traits<
decltype(&T::operator())> {};
56 template <
typename ReturnT,
typename ClassT,
typename... ArgTs>
57 struct fn_traits<ReturnT (ClassT::*)(ArgTs...)>
61 template <
typename ReturnT,
typename ClassT,
typename... ArgTs>
62 struct fn_traits<ReturnT (ClassT::*)(ArgTs...)
const>
66 template <
typename ReturnT,
typename ClassT,
typename... ArgTs>
67 struct fn_traits<ReturnT (ClassT::*)(ArgTs...)
const&>
71 template <
typename ReturnT,
typename ClassT,
typename... ArgTs>
72 struct fn_traits<ReturnT (ClassT::*)(ArgTs...) &&>
76 template <
typename ReturnT,
typename ClassT>
77 struct fn_traits<ReturnT ClassT::*>
81 template <
typename ReturnT,
typename ClassT>
82 struct fn_traits<
const ReturnT ClassT::*>
86template <
typename FnT,
int ArgN = 0>
90template <
typename FnT>
constexpr auto fn_arg_count_v
Determine traits of an arbitrary function/lambda/functor.