6 template<
typename... Args>
7 struct non_const_overload
9 template<
typename R,
typename C>
10 constexpr auto operator()(R (C::*ptr)(Args...)) const noexcept -> decltype(ptr)
15 template<
typename R,
typename C>
16 static constexpr auto of(R (C::*ptr)(Args...)) noexcept -> decltype(ptr)
22 template<
typename... Args>
25 template<
typename R,
typename C>
26 constexpr auto operator()(R (C::*ptr)(Args...)
const) const noexcept -> decltype(ptr)
31 template<
typename R,
typename C>
32 static constexpr auto of(R (C::*ptr)(Args...)
const) noexcept -> decltype(ptr)
38 template<
typename... Args>
39 struct overload : const_overload<Args...>, non_const_overload<Args...>
41 using const_overload<Args...>::of;
42 using const_overload<Args...>::operator();
43 using non_const_overload<Args...>::of;
44 using non_const_overload<Args...>::operator();
47 constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr)
53 static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr)
58 template<
typename R,
typename C,
typename... Args>
59 struct non_const_overload_r_c
61 constexpr auto operator()(R (C::*ptr)(Args...)) const noexcept -> decltype(ptr)
66 static constexpr auto of(R (C::*ptr)(Args...)) noexcept -> decltype(ptr) {
return ptr; }
69 template<
typename R,
typename C,
typename... Args>
70 struct const_overload_r_c
72 constexpr auto operator()(R (C::*ptr)(Args...)
const) const noexcept -> decltype(ptr)
77 static constexpr auto of(R (C::*ptr)(Args...)
const) noexcept -> decltype(ptr) {
return ptr; }
80 template<
typename R,
typename C,
typename... Args>
81 struct overload_r_c : const_overload_r_c<R, C, Args...>, non_const_overload_r_c<R, C, Args...>
83 using const_overload_r_c<R, C, Args...>::of;
84 using const_overload_r_c<R, C, Args...>::operator();
85 using non_const_overload_r_c<R, C, Args...>::of;
86 using non_const_overload_r_c<R, C, Args...>::operator();
88 constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr) {
return ptr; }
90 static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr) {
return ptr; }
95 template<
typename... Args>
96 constexpr __attribute__((__unused__)) detail::overload_r_c<Args...> overload_r_c = {};
97 template<
typename... Args>
98 constexpr __attribute__((__unused__)) detail::overload<Args...> overload = {};
99 template<
typename... Args>
100 constexpr __attribute__((__unused__)) detail::const_overload<Args...> const_overload = {};
101 template<
typename... Args>
102 constexpr __attribute__((__unused__)) detail::non_const_overload<Args...> non_const_overload = {};