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>,
84 template<
typename R,
typename C>
constexpr detail::ExprTree< detail::ExprType::LeafStaticPlaceholder, detail::MemberPtrs< Ptr > > f
typename detail::DecomposeMemberPtr< decltype(Ptr)>::StructType_t MemberPtrStruct_t
std::tuple_element_t< 0, decltype(TypeGetter(*static_cast< F * >(nullptr)))> RetTypeRaw_t
typename detail::DecomposeMemberPtr< decltype(Ptr)>::Value_t MemberPtrType_t
std::conditional_t< std::is_same_v< detail::RetTypeRaw_t< F >, detail::ReturnsVoid >, void, detail::RetTypeRaw_t< F > > RetType_t
std::conditional_t< std::is_same< T, void > {}, ReturnsVoid, T > VoidSafe
std::tuple_element_t< Idx+1, decltype(detail::TypeGetter(*static_cast< F * >(nullptr)))> ArgType_t
decltype(TypeGetter(&C::operator())) TypeGetter(const C &c)