RavEngine
Loading...
Searching...
No Matches
CallableTraits.hpp
1#pragma once
2#include <tuple>
3
4namespace RavEngine {
5 // adapted from answers on https://stackoverflow.com/questions/28509273/get-types-of-c-function-parameters
6
7 template<typename Sig>
8 struct signature;
9 template<typename Ret, typename...Args>
10 struct signature<Ret(Args...)> {
11 using type = std::tuple<Args...>;
12 };
13
14 template<typename Ret, typename Obj, typename...Args>
15 struct signature<Ret(Obj::*)(Args...)> {
16 using type = std::tuple<Args...>;
17 };
18 template<typename Ret, typename Obj, typename...Args>
19 struct signature<Ret(Obj::*)(Args...)const> {
20 using type = std::tuple<Args...>;
21 };
22 template<typename Fun>
23 concept is_fun = std::is_function_v<Fun>;
24
25 template<typename Fun>
26 concept is_mem_fun = std::is_member_function_pointer_v<std::decay_t<Fun>>;
27
28 template<typename Fun>
29 concept is_functor = std::is_class_v<std::decay_t<Fun>> && requires(Fun && t) {
30 &std::decay_t<Fun>::operator();
31 };
32
33 template<is_functor T>
34 using functor_args_t = typename signature<decltype(&std::decay_t<T>::operator())>::type;
35
36 template<is_functor T>
37 auto arguments(T&& t) -> typename signature<decltype(&std::decay_t<T>::operator())>::type;
38
39 template<is_functor T>
40 auto arguments(const T& t) -> typename signature<decltype(&std::decay_t<T>::operator())>::type;
41
42 // template<is_fun T>
43 // auto arguments(T&& t)->signature<T>::type;
44
45 template<is_fun T>
46 auto arguments(const T& t) -> typename signature<T>::type;
47
48 template<is_mem_fun T>
49 auto arguments(T&& t) -> typename signature<std::decay_t<T>>::type;
50
51 template<is_mem_fun T>
52 auto arguments(const T& t) -> typename signature<std::decay_t<T>>::type;
53}
Definition concurrentqueue.h:747
Definition CallableTraits.hpp:23
Definition CallableTraits.hpp:29
Definition CallableTraits.hpp:26
Definition Animation.hpp:6
Definition CallableTraits.hpp:8