54 #ifndef LELY_UTIL_C_CALL_HPP_
55 #define LELY_UTIL_C_CALL_HPP_
61 template <
class,
class>
64 template <
class,
class>
66 template <class F, class C, typename c_mem_fn<F, C>::type>
74 template <
class,
class>
77 template <
class T,
class... S>
83 template <
class T,
class... S>
87 template <
class T,
class S>
98 template <
class R,
class... ArgTypes,
class F>
101 function(ArgTypes... args,
void* data) noexcept {
102 return (*
static_cast<F*
>(data))(args...);
110 template <
class R,
class... ArgTypes,
class F>
118 template <
class R,
class... ArgTypes,
class C>
120 using type = R (C::*)(ArgTypes...);
127 template <
class R,
class... ArgTypes,
class C>
135 template <
class R,
class... ArgTypes,
class C,
139 function(ArgTypes... args,
void* data) noexcept {
140 return ((*
static_cast<C*
>(data)).*M)(args...);
148 template <
class R,
class... ArgTypes,
class C,
149 typename c_mem_fn<R (*)(ArgTypes...), C>::type M>
155 #endif // !LELY_UTIL_C_CALL_HPP_