NasNas
An intuitive and beginner friendly 2D game framework for C++
Introspection.hpp
1 // Created by Modar Nasser on 30/07/2021.
2 
3 #pragma once
4 
5 #include <SFML/System/Vector2.hpp>
6 
7 #include <NasNas/core/data/Rect.hpp>
8 
9 namespace introspect {
10  using namespace std;
11 #define NS_DEFINE_HAS_METHOD(name, signature) \
12  template<typename, typename T=signature> \
13  struct has_##name {}; \
14  template<typename C, typename Ret, typename... Args> \
15  struct has_##name<C, Ret(Args...)> { \
16  private: \
17  template <typename Rt> \
18  using remove_const_ref = remove_const_t<remove_reference_t<Rt>>; \
19  template<typename T> \
20  static constexpr auto check(T*) -> \
21  enable_if_t<is_base_of_v< \
22  remove_const_ref<decltype(declval<T>().name(declval<Args>()...))>,\
23  remove_const_ref<Ret> \
24  >, true_type>; \
25  template<typename> static constexpr false_type check(...); \
26  using type = decltype(check<C>(0)); \
27  public: \
28  static constexpr bool value = type::value; \
29  }; \
30  template <typename C, typename T=signature> \
31  inline constexpr bool has_##name##_v = has_##name<C, T>::value
32 
33  NS_DEFINE_HAS_METHOD(getPosition, sf::Vector2f());
34  NS_DEFINE_HAS_METHOD(getGlobalBounds, ns::FloatRect());
35  NS_DEFINE_HAS_METHOD(getBounds, ns::FloatRect());
36  NS_DEFINE_HAS_METHOD(update, void());
37 }