33 #include <type_traits>
45 std::is_same<T, void> {},
50 template<
typename R,
typename... Args>
51 std::tuple<VoidSafe<R>, Args...>
TypeGetter (R (*) (Args...));
56 template<
typename C,
typename R,
typename... Args>
57 std::tuple<VoidSafe<R>, Args...>
TypeGetter (R (C::*) (Args...)
const);
59 template<
typename C,
typename R,
typename... Args>
60 std::tuple<VoidSafe<R>, Args...>
TypeGetter (R (C::*) (Args...));
69 template<typename F,
size_t Idx>
70 using
ArgType_t = std::tuple_element_t<Idx + 1, decltype (detail::
TypeGetter (*static_cast<F*> (
nullptr)))>;
74 std::is_same_v<detail::
RetTypeRaw_t<F>, detail::ReturnsVoid>,
82 struct DecomposeMemberPtr
86 template<
typename R,
typename C>
87 struct DecomposeMemberPtr<R (C::*)>
90 using StructType_t = C;
94 template<
typename PtrType>
95 using MemberTypeType_t =
typename detail::DecomposeMemberPtr<PtrType>::Value_t;
97 template<
typename PtrType>