1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
#include <type_traits>
namespace detail {
template < typename... > struct is_const_qualified : std::false_type {} ;
template < typename R, typename... A > struct is_const_qualified< R(A...) const > : std::true_type {} ;
template < typename R, typename... A > struct is_const_qualified< R( A..., ... ) const > : std::true_type {} ;
template < typename... > struct is_volatile_qualified : std::false_type {} ;
template < typename R, typename... A > struct is_volatile_qualified< R(A...) volatile > : std::true_type {} ;
template < typename R, typename... A > struct is_volatile_qualified< R( A..., ... ) volatile > : std::true_type {} ;
template < typename... > struct is_cv_qualified : std::false_type {} ;
template < typename R, typename... A > struct is_cv_qualified< R(A...) const volatile > : std::true_type {} ;
template < typename R, typename... A > struct is_cv_qualified< R( A..., ... ) const volatile > : std::true_type {} ;
template < typename... > struct is_ref_qualified : std::false_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R(A...) & > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R(A...) && > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R(A...) const & > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R(A...) const && > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R(A...) volatile & > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R(A...) volatile && > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R(A...) const volatile & > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R(A...) const volatile && > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R( A..., ... ) & > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R( A..., ... ) && > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R( A..., ... ) const & > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R( A..., ... ) const && > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R( A..., ... ) volatile & > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R( A..., ... ) volatile && > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R( A..., ... ) const volatile & > : std::true_type {} ;
template < typename R, typename... A > struct is_ref_qualified< R( A..., ... ) const volatile && > : std::true_type {} ;
}
template < typename T > struct is_referenceable
: std::conditional< detail::is_const_qualified<T>::value ||
detail::is_volatile_qualified<T>::value ||
detail::is_cv_qualified<T>::value ||
detail::is_ref_qualified<T>::value,
std::false_type, std::true_type >::type {} ;
|