knowL: Knowledge Libraries
Loading...
Searching...
No Matches
overload.h
1//BEGIN OVERLOAD
2namespace overload
3{
4 namespace detail
5 {
6 template <typename... Args>
8 {
9 template <typename R, typename C>
10 constexpr auto operator()(R (C::*ptr)(Args...)) const noexcept -> decltype(ptr)
11 { return ptr; }
12
13 template <typename R, typename C>
14 static constexpr auto of(R (C::*ptr)(Args...)) noexcept -> decltype(ptr)
15 { return ptr; }
16 };
17
18 template <typename... Args>
20 {
21 template <typename R, typename C>
22 constexpr auto operator()(R (C::*ptr)(Args...) const) const noexcept -> decltype(ptr)
23 { return ptr; }
24
25 template <typename R, typename C>
26 static constexpr auto of(R (C::*ptr)(Args...) const) noexcept -> decltype(ptr)
27 { return ptr; }
28 };
29
30 template <typename... Args>
31 struct overload : const_overload<Args...>, non_const_overload<Args...>
32 {
33 using const_overload<Args...>::of;
34 using const_overload<Args...>::operator();
35 using non_const_overload<Args...>::of;
36 using non_const_overload<Args...>::operator();
37
38 template <typename R>
39 constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr)
40 { return ptr; }
41
42 template <typename R>
43 static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr)
44 { return ptr; }
45 };
46 template <typename R, typename C, typename... Args>
48 {
49 constexpr auto operator()(R (C::*ptr)(Args...)) const noexcept -> decltype(ptr)
50 { return ptr; }
51
52 static constexpr auto of(R (C::*ptr)(Args...)) noexcept -> decltype(ptr)
53 { return ptr; }
54 };
55
56 template <typename R, typename C, typename... Args>
58 {
59 constexpr auto operator()(R (C::*ptr)(Args...) const) const noexcept -> decltype(ptr)
60 { return ptr; }
61
62 static constexpr auto of(R (C::*ptr)(Args...) const) noexcept -> decltype(ptr)
63 { return ptr; }
64 };
65
66 template <typename R, typename C, typename... Args>
67 struct overload_r_c : const_overload_r_c<R, C, Args...>, non_const_overload_r_c<R, C, Args...>
68 {
69 using const_overload_r_c<R, C, Args...>::of;
70 using const_overload_r_c<R, C, Args...>::operator();
71 using non_const_overload_r_c<R, C, Args...>::of;
72 using non_const_overload_r_c<R, C, Args...>::operator();
73
74 constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr)
75 { return ptr; }
76
77 static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr)
78 { return ptr; }
79 };
80
81 }
82
83 template <typename... Args> constexpr __attribute__((__unused__)) detail::overload_r_c<Args...> overload_r_c = {};
84 template <typename... Args> constexpr __attribute__((__unused__)) detail::overload<Args...> overload = {};
85 template <typename... Args> constexpr __attribute__((__unused__)) detail::const_overload<Args...> const_overload = {};
86 template <typename... Args> constexpr __attribute__((__unused__)) detail::non_const_overload<Args...> non_const_overload = {};
87}
88//END OVERLOAD
Definition overload.h:58
Definition overload.h:20
Definition overload.h:68
Definition overload.h:32