17 template<
typename R,
typename... Args>
23 template<
typename C,
typename R,
typename... Args>
24 std::tuple<R, Args...>*
TypeGetter (R (C::*) (Args...)
const);
26 template<
typename C,
typename R,
typename... Args>
27 std::tuple<R, Args...>*
TypeGetter (R (C::*) (Args...));
33 using CallTypeGetter_t = std::decay_t<decltype (*detail::TypeGetter (*static_cast<F*> (
nullptr)))>;
39 template<SomeInvokable F,
size_t Idx>
40 using ArgType_t = std::tuple_element_t<Idx + 1, detail::CallTypeGetter_t<F>>;
42 template<SomeInvokable F>
43 using RetType_t = std::tuple_element_t<0, detail::CallTypeGetter_t<F>>;
45 template<SomeInvokable F>
46 inline constexpr auto ArgCount_v = std::tuple_size_v<detail::CallTypeGetter_t<F>> - 1;
55 template<
typename R,
typename C>
63 template<
typename PtrType>
66 template<
typename PtrType>
std::tuple< R, Args... > * TypeGetter(R(*)(Args...))
std::decay_t< decltype(*detail::TypeGetter(*static_cast< F * >(nullptr)))> CallTypeGetter_t
std::tuple_element_t< 0, detail::CallTypeGetter_t< F > > RetType_t
constexpr auto ArgCount_v
typename detail::DecomposeMemberPtr< PtrType >::Value_t MemberTypeType_t
MemberTypeType_t< decltype(Ptr)> MemberPtrType_t
std::tuple_element_t< Idx+1, detail::CallTypeGetter_t< F > > ArgType_t
MemberTypeStruct_t< decltype(Ptr)> MemberPtrStruct_t
typename detail::DecomposeMemberPtr< PtrType >::StructType_t MemberTypeStruct_t