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)
13 template <
typename R,
typename C>
14 static constexpr auto of(R (C::*ptr)(Args...)) noexcept -> decltype(ptr)
18 template <
typename... Args>
21 template <
typename R,
typename C>
22 constexpr auto operator()(R (C::*ptr)(Args...)
const) const noexcept -> decltype(ptr)
25 template <
typename R,
typename C>
26 static constexpr auto of(R (C::*ptr)(Args...)
const) noexcept -> decltype(ptr)
30 template <
typename... Args>
31 struct overload : const_overload<Args...>, non_const_overload<Args...>
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();
39 constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr)
43 static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr)
46 template <
typename R,
typename C,
typename... Args>
47 struct non_const_overload_r_c
49 constexpr auto operator()(R (C::*ptr)(Args...)) const noexcept -> decltype(ptr)
52 static constexpr auto of(R (C::*ptr)(Args...)) noexcept -> decltype(ptr)
56 template <
typename R,
typename C,
typename... Args>
57 struct const_overload_r_c
59 constexpr auto operator()(R (C::*ptr)(Args...)
const) const noexcept -> decltype(ptr)
62 static constexpr auto of(R (C::*ptr)(Args...)
const) noexcept -> decltype(ptr)
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...>
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();
74 constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr)
77 static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr)
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 = {};