Refureku
v2.2.0
C++17 runtime reflection library.
TypeTraitsMacros.h
1
8
#pragma once
9
10
#include <type_traits>
11
26
#define RFK_GENERATE_IMPLEMENTS_METHOD_TRAITS(MethodName) \
27
template<typename Class, typename T> struct implements_##MethodName {}; \
28
template <typename Class, typename Ret, typename... Args> \
29
struct implements_##MethodName<Class, Ret(Args...)> \
30
{ \
31
private: \
32
template<typename T> \
33
static constexpr auto check(T*) -> typename std::is_same<decltype(std::declval<T>().MethodName(std::declval<Args>()...)), Ret>; \
34
\
35
template<typename> \
36
static constexpr std::false_type check(...); \
37
\
38
public: \
39
static constexpr bool value = decltype(check<Class>(nullptr))::value; \
40
}
41
56
#define RFK_GENERATE_IMPLEMENTS_STATIC_METHOD_TRAITS(MethodName) \
57
template<typename Class, typename T> struct implements_static_##MethodName {}; \
58
template <typename Class, typename Ret, typename... Args> \
59
struct implements_static_##MethodName<Class, Ret(Args...)> \
60
{ \
61
private: \
62
template<typename T> \
63
static constexpr auto check(T*) -> typename std::is_same<decltype(T::MethodName(std::declval<Args>()...)), Ret>; \
64
\
65
template<typename> \
66
static constexpr std::false_type check(...); \
67
\
68
public: \
69
static constexpr bool value = decltype(check<Class>(nullptr))::value; \
70
}
71
86
#define RFK_GENERATE_IS_CALLABLE_METHOD_TRAITS(MethodName) \
87
template<typename Class, typename T> struct isCallable_##MethodName {}; \
88
template <typename Class, typename Ret, typename... Args> \
89
struct isCallable_##MethodName<Class, Ret(Args...)> \
90
{ \
91
private: \
92
template<typename T> \
93
static constexpr auto check(T*) -> typename std::is_convertible<decltype(std::declval<T>().MethodName(std::declval<Args>()...)), Ret>; \
94
\
95
template<typename> \
96
static constexpr std::false_type check(...); \
97
\
98
public: \
99
static constexpr bool value = decltype(check<Class>(nullptr))::value; \
100
}
101
116
#define RFK_GENERATE_IS_CALLABLE_STATIC_METHOD_TRAITS(MethodName) \
117
template<typename Class, typename T> struct isCallable_static_##MethodName {}; \
118
template <typename Class, typename Ret, typename... Args> \
119
struct isCallable_static_##MethodName<Class, Ret(Args...)> \
120
{ \
121
private: \
122
template<typename T> \
123
static constexpr auto check(T*) -> typename std::is_convertible<decltype(T::MethodName(std::declval<Args>()...)), Ret>; \
124
\
125
template<typename> \
126
static constexpr std::false_type check(...); \
127
\
128
public: \
129
static constexpr bool value = decltype(check<Class>(nullptr))::value; \
130
}
131
146
#define RFK_GENERATE_IMPLEMENTS_TEMPLATE1_METHOD_TRAITS(MethodName) \
147
template<typename Class, typename TemplateType1, typename T> struct implements_template1_##MethodName {}; \
148
template <typename Class, typename TemplateType1, typename Ret, typename... Args> \
149
struct implements_template1_##MethodName<Class, TemplateType1, Ret(Args...)> \
150
{ \
151
private: \
152
template<typename T> \
153
static constexpr auto check(T*) -> typename std::is_same<decltype(std::declval<T>().template MethodName<TemplateType1>(std::declval<Args>()...)), Ret>; \
154
\
155
template<typename> \
156
static constexpr std::false_type check(...); \
157
\
158
public: \
159
static constexpr bool value = decltype(check<Class>(nullptr))::value; \
160
}
161
175
#define RFK_GENERATE_HAS_FIELD_TRAITS(fieldName) \
176
template <typename Class, typename FieldType> \
177
struct hasField_##fieldName \
178
{ \
179
private: \
180
template <typename T> \
181
static constexpr auto check(T*) -> typename std::is_same<std::remove_reference_t<decltype(std::declval<T>().fieldName)>, FieldType>; \
182
\
183
template <typename> \
184
static constexpr std::false_type check(...); \
185
\
186
public: \
187
static constexpr bool value = decltype(check<Class>(nullptr))::value; \
188
}
189
Refureku
Library
Include
Public
Refureku
Misc
TypeTraitsMacros.h
Generated by
1.9.3