24 :
public _impl::fn_traits<std::remove_reference_t<T>> {};
27 template <
typename ReturnT,
typename... ArgTs>
29 using return_type = ReturnT;
30 using arg_types = std::tuple<ArgTs...>;
35 struct fn_object_traits;
38 template <
typename ReturnT,
typename ClassT,
typename... ArgTs>
39 struct fn_object_traits<ReturnT (ClassT::*)(ArgTs...)>
43 template <
typename ReturnT,
typename ClassT,
typename... ArgTs>
44 struct fn_object_traits<ReturnT (ClassT::*)(ArgTs...)
const>
50 requires requires { &T::operator(); }
52 :
public fn_object_traits<
decltype(&T::operator())> {};
55 template <
typename ReturnT,
typename ClassT,
typename... ArgTs>
56 struct fn_traits<ReturnT (ClassT::*)(ArgTs...)>
60 template <
typename ReturnT,
typename ClassT,
typename... ArgTs>
61 struct fn_traits<ReturnT (ClassT::*)(ArgTs...)
const>
65 template <
typename ReturnT,
typename ClassT,
typename... ArgTs>
66 struct fn_traits<ReturnT (ClassT::*)(ArgTs...)
const&>
70 template <
typename ReturnT,
typename ClassT,
typename... ArgTs>
71 struct fn_traits<ReturnT (ClassT::*)(ArgTs...) &&>
75 template <
typename ReturnT,
typename ClassT>
76 struct fn_traits<ReturnT ClassT::*>
80 template <
typename ReturnT,
typename ClassT>
81 struct fn_traits<
const ReturnT ClassT::*>
85 template <
typename FnT,
int ArgN = 0>
89 template <
typename FnT>