The Gaudi Framework  v30r3 (a5ef0a68)
invoke.h File Reference
#include <functional>
#include <type_traits>
#include <utility>
Include dependency graph for invoke.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  Gaudi::detail2::is_reference_wrapper< T >
 
struct  Gaudi::detail2::is_reference_wrapper< std::reference_wrapper< U > >
 

Namespaces

 Gaudi
 Helper functions to set/get the application return code.
 
 Gaudi::detail2
 

Functions

template<class Base , class T , class Derived , class... Args>
auto Gaudi::detail2::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)...))>
 
template<class Base , class T , class RefWrap , class... Args>
auto Gaudi::detail2::INVOKE (T Base::*pmf, RefWrap &&ref, Args &&...args) noexcept(noexcept((ref.get().*pmf)(std::forward< Args >(args)...))) -> std::enable_if_t< std::is_function< T >::value &&is_reference_wrapper< std::decay_t< RefWrap >>::value, decltype((ref.get().*pmf)(std::forward< Args >(args)...))>
 
template<class Base , class T , class Pointer , class... Args>
auto Gaudi::detail2::INVOKE (T Base::*pmf, Pointer &&ptr, Args &&...args) noexcept( noexcept(((*std::forward< Pointer >(ptr)).*pmf)(std::forward< Args >(args)...))) -> std::enable_if_t< std::is_function< T >::value &&!is_reference_wrapper< std::decay_t< Pointer >>::value && !std::is_base_of< Base, std::decay_t< Pointer >>::value, decltype(((*std::forward< Pointer >(ptr)).*pmf)(std::forward< Args >(args)...))>
 
template<class Base , class T , class Derived >
auto Gaudi::detail2::INVOKE (T Base::*pmd, Derived &&ref) noexcept(noexcept(std::forward< Derived >(ref).*pmd)) -> std::enable_if_t<!std::is_function< T >::value &&std::is_base_of< Base, std::decay_t< Derived >>::value, decltype(std::forward< Derived >(ref).*pmd)>
 
template<class Base , class T , class RefWrap >
auto Gaudi::detail2::INVOKE (T Base::*pmd, RefWrap &&ref) noexcept(noexcept(ref.get().*pmd)) -> std::enable_if_t<!std::is_function< T >::value &&is_reference_wrapper< std::decay_t< RefWrap >>::value, decltype(ref.get().*pmd)>
 
template<class Base , class T , class Pointer >
auto Gaudi::detail2::INVOKE (T Base::*pmd, Pointer &&ptr) noexcept(noexcept((*std::forward< Pointer >(ptr)).*pmd)) -> std::enable_if_t<!std::is_function< T >::value &&!is_reference_wrapper< std::decay_t< Pointer >>::value && !std::is_base_of< Base, std::decay_t< Pointer >>::value, decltype((*std::forward< Pointer >(ptr)).*pmd)>
 
template<class F , class... Args>
auto Gaudi::detail2::INVOKE (F &&f, Args &&...args) noexcept(noexcept(std::forward< F >(f)(std::forward< Args >(args)...))) -> std::enable_if_t<!std::is_member_pointer< std::decay_t< F >>::value, decltype(std::forward< F >(f)(std::forward< Args >(args)...))>
 
template<class F , class... ArgTypes>
auto Gaudi::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)...))