15 template <
class Base,
class T,
class Derived,
class... Args>
17 noexcept(noexcept((std::forward<Derived>(
ref).*pmf)(std::forward<Args>(
args)...)))
18 -> std::enable_if_t<std::is_function<T>::value &&
19 std::is_base_of<Base, std::decay_t<Derived>>::value,
20 decltype((std::forward<Derived>(
ref).*pmf)(std::forward<Args>(
args)...))>
22 return (std::forward<Derived>(
ref).*pmf)(std::forward<Args>(
args)...);
25 template <
class Base,
class T,
class RefWrap,
class... Args>
27 noexcept(noexcept((
ref.
get().*pmf)(std::forward<Args>(
args)...)))
28 -> std::enable_if_t<std::is_function<T>::value &&
30 decltype((
ref.
get().*pmf)(std::forward<Args>(
args)...))>
33 return (
ref.get().*pmf)(std::forward<Args>(args)...);
36 template <
class Base,
class T,
class Pointer,
class... Args>
38 noexcept(noexcept(((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(
args)...)))
39 -> std::enable_if_t<std::is_function<T>::value &&
41 !std::is_base_of<Base, std::decay_t<Pointer>>::value,
42 decltype(((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(
args)...))>
44 return ((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(
args)...);
47 template <
class Base,
class T,
class Derived>
49 noexcept(noexcept(std::forward<Derived>(
ref).*pmd))
50 -> std::enable_if_t<!std::is_function<T>::value &&
51 std::is_base_of<Base, std::decay_t<Derived>>::value,
52 decltype(std::forward<Derived>(
ref).*pmd)>
54 return std::forward<Derived>(
ref).*pmd;
57 template <
class Base,
class T,
class RefWrap>
59 noexcept(noexcept(
ref.
get().*pmd))
60 -> std::enable_if_t<!std::is_function<T>::value &&
64 return ref.get().*pmd;
67 template <
class Base,
class T,
class Po
inter>
68 auto INVOKE(T Base::*pmd, Pointer&& ptr)
69 noexcept(noexcept((*std::forward<Pointer>(ptr)).*pmd))
70 -> std::enable_if_t<!std::is_function<T>::value &&
72 !std::is_base_of<Base, std::decay_t<Pointer>>::value,
73 decltype((*std::forward<Pointer>(ptr)).*pmd)>
75 return (*std::forward<Pointer>(ptr)).*pmd;
78 template <
class F,
class... Args>
80 noexcept(noexcept(std::forward<F>(f)(std::forward<Args>(
args)...)))
81 -> std::enable_if_t<!std::is_member_pointer<std::decay_t<F>>::value,
82 decltype(std::forward<F>(f)(std::forward<Args>(
args)...))>
84 return std::forward<F>(f)(std::forward<Args>(args)...);
88 template<
class F,
class... ArgTypes >
91 noexcept(noexcept(detail2::
INVOKE(
std::forward<F>(f),
std::forward<ArgTypes>(
args)...)))
92 -> decltype(detail2::
INVOKE(
std::forward<F>(f),
std::forward<ArgTypes>(
args)...))
94 return detail2::INVOKE(std::forward<F>(f), std::forward<ArgTypes>(args)...);
auto INVOKE(T Base::*pmf, Derived &&ref, Args &&...args) noexcept(noexcept((std::forward< Derived >(ref).*pmf)(std::forward< Args >(args)...))) -> std::enable_if_t< std::is_function< T >::value && std::is_base_of< Base, std::decay_t< Derived >>::value, decltype((std::forward< Derived >(ref).*pmf)(std::forward< Args >(args)...))>
auto invoke(F &&f, ArgTypes &&...args) noexcept(noexcept(detail2::INVOKE(std::forward< F >(f), std::forward< ArgTypes >(args)...))) -> decltype(detail2::INVOKE(std::forward< F >(f), std::forward< ArgTypes >(args)...))
Helper functions to set/get the application return code.