15 #ifndef MLPACK_CORE_SFINAE_UTILITY
16 #define MLPACK_CORE_SFINAE_UTILITY
18 #include <type_traits>
42 template<
typename Class,
43 template<
typename...>
class MethodForm,
44 size_t AdditionalArgsCount>
47 template<
typename Class,
template<
typename...>
class MethodForm>
50 void operator()(MethodForm<Class>);
53 template<
typename Class,
template<
typename...>
class MethodForm>
57 void operator()(MethodForm<Class, T1>);
60 template<
typename Class,
template<
typename...>
class MethodForm>
63 template<
class T1,
class T2>
64 void operator()(MethodForm<Class, T1, T2>);
67 template<
typename Class,
template<
typename...>
class MethodForm>
70 template<
class T1,
class T2,
class T3>
71 void operator()(MethodForm<Class, T1, T2, T3>);
74 template<
typename Class,
template<
typename...>
class MethodForm>
77 template<
class T1,
class T2,
class T3,
class T4>
78 void operator()(MethodForm<Class, T1, T2, T3, T4>);
81 template<
typename Class,
template<
typename...>
class MethodForm>
84 template<
class T1,
class T2,
class T3,
class T4,
class T5>
85 void operator()(MethodForm<Class, T1, T2, T3, T4, T5>);
88 template<
typename Class,
template<
typename...>
class MethodForm>
91 template<
class T1,
class T2,
class T3,
class T4,
class T5,
class T6>
92 void operator()(MethodForm<Class, T1, T2, T3, T4, T5, T6>);
95 template<
typename Class,
template<
typename...>
class MethodForm>
98 template<
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7>
99 void operator()(MethodForm<Class, T1, T2, T3, T4, T5, T6, T7>);
106 template<
typename U, U>
struct SigCheck : std::true_type {};
126 #define HAS_MEM_FUNC(FUNC, NAME) \
127 template<typename T, typename sig, typename = std::true_type> \
128 struct NAME : std::false_type {}; \
130 template<typename T, typename sig> \
135 std::integral_constant<bool, SigCheck<sig, &T::FUNC>::value> \
136 > : std::true_type {};
141 #define HAS_METHOD_FORM_BASE(METHOD, NAME, MAXN) \
142 template<typename Class, \
143 template<typename...> class MF , \
148 template<typename C, template<typename...> class MethodForm, int N> \
149 using MFD = mlpack::sfinae::MethodFormDetector<C, MethodForm, N>; \
152 struct WithNAdditionalArgs \
154 using yes = char[1]; \
155 using no = char[2]; \
157 template<typename T, typename ResultType> \
158 using EnableIfVoid = \
159 typename std::enable_if<std::is_void<T>::value, ResultType>::type; \
161 template<typename C> \
162 static EnableIfVoid<decltype(MFD<C, MF, N>()(&C::METHOD)), yes&> chk(int); \
164 static no& chk(...); \
166 static const bool value = sizeof(chk<Class>(0)) == sizeof(yes); \
170 struct WithGreaterOrEqualNumberOfAdditionalArgs \
172 using type = typename std::conditional< \
173 WithNAdditionalArgs<N>::value, \
175 typename std::conditional< \
177 WithGreaterOrEqualNumberOfAdditionalArgs<N + 1>, \
178 std::false_type>::type>::type; \
179 static const bool value = type::value; \
182 static const bool value = \
183 WithGreaterOrEqualNumberOfAdditionalArgs<MinN>::value; \
199 #define HAS_ANY_METHOD_FORM(FUNC, NAME) \
200 template <typename T> \
203 template <typename Q = T> \
205 std::enable_if<std::is_member_function_pointer<decltype(&Q::FUNC)>::value, \
207 f(int) { return 1;} \
209 template <typename Q = T> \
210 static char f(char) { return 0; } \
212 static const bool value = sizeof(f<T>(0)) != sizeof(char); \
218 #define SINGLE_ARG(...) __VA_ARGS__
251 #define HAS_METHOD_FORM(METHOD, NAME) \
252 HAS_METHOD_FORM_BASE(SINGLE_ARG(METHOD), SINGLE_ARG(NAME), 7)
285 #define HAS_EXACT_METHOD_FORM(METHOD, NAME) \
286 HAS_METHOD_FORM_BASE(SINGLE_ARG(METHOD), SINGLE_ARG(NAME), 0)
Utility struct for checking signatures.