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) \
27template<typename Class, typename T> struct implements_##MethodName {}; \
28template <typename Class, typename Ret, typename... Args> \
29struct 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) \
57template<typename Class, typename T> struct implements_static_##MethodName {}; \
58template <typename Class, typename Ret, typename... Args> \
59struct 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) \
87template<typename Class, typename T> struct isCallable_##MethodName {}; \
88template <typename Class, typename Ret, typename... Args> \
89struct 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) \
117template<typename Class, typename T> struct isCallable_static_##MethodName {}; \
118template <typename Class, typename Ret, typename... Args> \
119struct 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) \
147template<typename Class, typename TemplateType1, typename T> struct implements_template1_##MethodName {}; \
148template <typename Class, typename TemplateType1, typename Ret, typename... Args> \
149struct 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) \
176template <typename Class, typename FieldType> \
177struct 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