FunctionInfo.hpp
1 // Distributed under the MIT License.
2 // See LICENSE.txt for details.
3 
4 #pragma once
5 
6 #include "Utilities/TMPL.hpp"
7 
8 namespace tt {
9 /// \cond
10 namespace detail {
11 template <typename T>
12 struct function_info_impl;
13 
14 template <typename Ret, typename... Args>
15 struct function_info_impl<Ret(Args...)> {
16  using return_type = Ret;
17  using argument_types = tmpl::list<Args...>;
18  using class_type = void;
19 };
20 
21 template <typename Ret, typename... Args>
22 struct function_info_impl<Ret(Args...) noexcept> {
23  using return_type = Ret;
24  using argument_types = tmpl::list<Args...>;
25  using class_type = void;
26 };
27 
28 #define FUNCTION_INFO_IMPL_FUNCTION_PTR(MODIFIERS, NOEXCEPT_STATUS) \
29  template <typename Ret, \
30  typename... Args> /* NOLINTNEXTLINE(misc-macro-parentheses) */ \
31  struct function_info_impl<Ret (*MODIFIERS)(Args...) NOEXCEPT_STATUS> { \
32  using return_type = Ret; \
33  using argument_types = tmpl::list<Args...>; \
34  using class_type = void; \
35  }
36 
37 FUNCTION_INFO_IMPL_FUNCTION_PTR(, );
38 FUNCTION_INFO_IMPL_FUNCTION_PTR(, noexcept);
39 FUNCTION_INFO_IMPL_FUNCTION_PTR(const, );
40 FUNCTION_INFO_IMPL_FUNCTION_PTR(const, noexcept);
41 FUNCTION_INFO_IMPL_FUNCTION_PTR(volatile, );
42 FUNCTION_INFO_IMPL_FUNCTION_PTR(volatile, noexcept);
43 FUNCTION_INFO_IMPL_FUNCTION_PTR(const volatile, );
44 FUNCTION_INFO_IMPL_FUNCTION_PTR(const volatile, noexcept);
45 #undef FUNCTION_INFO_IMPL_FUNCTION_PTR
46 
47 #define FUNCTION_INFO_IMPL_CLASS(MODIFIERS) \
48  template <typename Ret, typename Class, \
49  typename... Args> /* NOLINTNEXTLINE(misc-macro-parentheses) */ \
50  struct function_info_impl<Ret (Class::*)(Args...) MODIFIERS> { \
51  using return_type = Ret; \
52  using argument_types = tmpl::list<Args...>; \
53  using class_type = Class; \
54  }
55 
56 FUNCTION_INFO_IMPL_CLASS();
57 FUNCTION_INFO_IMPL_CLASS(const);
58 FUNCTION_INFO_IMPL_CLASS(noexcept);
59 FUNCTION_INFO_IMPL_CLASS(volatile);
60 FUNCTION_INFO_IMPL_CLASS(const noexcept);
61 FUNCTION_INFO_IMPL_CLASS(const volatile);
62 FUNCTION_INFO_IMPL_CLASS(const volatile noexcept);
63 FUNCTION_INFO_IMPL_CLASS(volatile noexcept);
64 #undef FUNCTION_INFO_IMPL_CLASS
65 } // namespace detail
66 /// \endcond
67 
68 /*!
69  * \ingroup TypeTraitsGroup
70  * \brief Returns a struct that contains the return type, argument types, and
71  * the class type if the `F` is a non-static member function
72  *
73  * The return class has member type aliases:
74  * - `return_type` The return type of the function
75  * - `argument_types` A `tmpl::list` of the arguments types of the function
76  * - `class_type` The type of the class if the function is a non-static member
77  * function, otherwise `void`
78  *
79  * \note For static member variables the class will be `void` because they are
80  * effectively free functions.
81  */
82 template <typename F>
83 using function_info = detail::function_info_impl<F>;
84 } // namespace tt
tt::function_info
detail::function_info_impl< F > function_info
Returns a struct that contains the return type, argument types, and the class type if the F is a non-...
Definition: FunctionInfo.hpp:83
tt
Definition: TensorExpression.hpp:113
TMPL.hpp