Support Class Library
A set of tools providing classes and utility
invoke.h
Go to the documentation of this file.
1 #pragma once
2 #include <functional>
3 #include <utility>
4 #include <scl/macros.h>
6 
7 namespace scl{
8  namespace utils{
9 #ifdef SCL_CPP17
10  template <class F, class... Args>
11  std::invoke_result_t<F, Args...> invoke(F&& f, Args&&... args){
12  return std::invoke(
13  std::forward<F>(f),
14  std::forward<Args>(args)...
15  );
16  }
17 
18  template <class R, class Class, class... Args>
19  inline R invoke(META::memfn_type<R, Class, Args...> fn, Class* const obj, Args&&... args){
20  //pointer overload
21  return (obj->*fn)(
22  std::forward<Args>(args)...
23  );
24  }
25 
26  template <class R, class Class, class... Args>
27  inline R invoke(META::const_memfn_type<R, Class, Args...> fn, realConst(Class*) obj, Args&&... args){
28  //pointer overload
29  return (obj->*fn)(
30  std::forward<Args>(args)...
31  );
32  }
33 
34  template <class R, class Class>
35  inline R invoke(META::mem_ptr_type<R, Class> fn, const Class* obj){
36  return obj->*fn;
37  }
38 #else
39 
40  /*template <class F, class R, class... Args>
41  R invoke(F&& fn, Args&&... args);*/
42 
43  template <class R, class... Args>
44  inline R invoke(META::fn_sig_type<R, Args...> fn, Args&&... args){
45  // raw function overload
46  return fn(
47  std::forward<Args>(args)...
48  );
49  }
50 
51  template <class R, class Class, class... Args>
52  inline R invoke(META::memfn_type<R, Class, Args...> fn, Class& obj, Args&&... args){
53  //default object overload
54  return (obj.*fn)(
55  std::forward<Args>(args)...
56  );
57  }
58 
59  template <class R, class Class, class... Args>
60  inline R invoke(META::const_memfn_type<R, Class, Args...> fn, const Class& obj, Args&&... args){
61  //const object overload
62  return (obj.*fn)(
63  std::forward<Args>(args)...
64  );
65  }
66 
67  template <class R, class Class, class... Args>
68  inline R invoke(META::memfn_type<R, Class, Args...> fn, Class&& obj, Args&&... args){
69  //rvalue/forward overload
70  return (obj.*fn)(
71  std::forward<Args>(args)...
72  );
73  }
74 
75  template <class R, class Class, class... Args>
76  inline R invoke(META::memfn_type<R, Class, Args...> fn, Class* const obj, Args&&... args){
77  //pointer overload
78  return (obj->*fn)(
79  std::forward<Args>(args)...
80  );
81  }
82 
83  template <class R, class Class, class... Args>
84  inline R invoke(META::const_memfn_type<R, Class, Args...> fn, realConst(Class*) obj, Args&&... args){
85  //pointer overload
86  return (obj->*fn)(
87  std::forward<Args>(args)...
88  );
89  }
90 
91  template <class R, class Class>
92  inline R invoke(META::mem_ptr_type<R, Class> fn, const Class& obj){
93  return obj.*fn;
94  }
95 
96  template <class R, class Class>
97  inline R invoke(META::mem_ptr_type<R, Class> fn, const Class* obj){
98  return obj->*fn;
99  }
100 
101  template <class F, class... Args>
102  inline auto invoke(F&& fn, Args&&... args) SCL_RETURNS(
103  std::forward<F>(fn)(
104  std::forward<Args>(args)...
105  )
106  )// generic overload
107 #endif
108  template <class F, class... Args>
109  using invoke_result_t = decltype(invoke(std::declval<F>(), std::declval<Args>()...));
110  }
111 }
Global namespace of the SCL.
Definition: alias.hpp:3
#define realConst(type)
Definition: macros.h:3
auto invoke(F &&fn, Args &&... args) -> decltype(std::forward< F >(fn)(std::forward< Args >(args)...))
Definition: invoke.h:102
#define SCL_RETURNS(stmt)
Definition: macros.h:10
decltype(invoke(std::declval< F >(), std::declval< Args >()...)) invoke_result_t
Definition: invoke.h:109
R invoke(scl::tools::meta ::fn_sig_type< R, Args... > fn, Args &&... args)
Definition: invoke.h:44