10#ifndef BOOST_CLBL_TRTS_IS_INVOCABLE_IMPL_HPP
11#define BOOST_CLBL_TRTS_IS_INVOCABLE_IMPL_HPP
19namespace boost {
namespace callable_traits {
namespace detail {
29 check<
typename std::remove_reference<
decltype(*std::declval<U>())>::type>*
33 static std::int16_t
test(...);
35 static constexpr const bool value =
36 sizeof(test<T>(
nullptr)) ==
sizeof(std::int8_t);
45 template<
typename T,
typename = std::true_type>
52 can_dereference<T>::value && !is_reference_wrapper<T>::value
54 using type =
decltype(*std::declval<T>());
59 using type =
decltype(std::declval<T>().get());
69 template<
typename Base,
typename T,
70 typename IsBaseOf = std::is_base_of<Base, shallow_decay<T>>,
71 typename IsSame = std::is_same<Base, shallow_decay<T>>>
75 template<
typename Traits,
bool = Traits::is_const_member::value
76 || Traits::is_volatile_member::value
77 || Traits::is_lvalue_reference_member::value
78 || Traits::is_rvalue_reference_member::value>
81 template<
typename... Rgs,
82 typename U =
typename Traits::type>
94 template<typename Pmf,
bool Ignored>
99 template<
typename U,
typename... Rgs,
107 template<typename Pmd,
bool Ignored>
120 template<typename T, typename... Args>
124 using result =
decltype(
test{}(0, ::std::declval<Args>()...));
125 using type = std::integral_constant<bool, result::value>;
128 template<
typename... Args>
133 template<
typename IsInvocable,
typename Ret,
typename T,
typename... Args>
137 using result =
decltype(
test{}(0, ::std::declval<Args>()...));
138 using type = std::integral_constant<bool,
139 std::is_convertible<typename result::_::type, Ret>::value
140 || std::is_same<Ret, void>::value>;
143 template<
typename Ret,
typename T,
typename... Args>
std::integral_constant< bool, can_dereference_t< T >::value > can_dereference
typename std::conditional< IsBaseOf::value||IsSame::value, T, generalize< T > >::type generalize_if_dissimilar
typename BOOST_CLBL_TRTS_DISJUNCTION(function_object< unwrap_reference< T > >, function< T >, pmf< T >, pmd< T >, default_callable_traits< T >)::traits traits
typename is_reference_wrapper_t< shallow_decay< T > >::type is_reference_wrapper
typename generalize_t< T >::type generalize
static std::int8_t test(check< typename std::remove_reference< decltype(*std::declval< U >())>::type > *)
static constexpr const bool value
static std::int16_t test(...)
decltype(std::declval< T >().get()) type
decltype(*std::declval< T >()) type
decltype(test{}(0, ::std::declval< Args >()...)) result
detail::traits< T > traits
std::integral_constant< bool, result::value > type
detail::traits< T > traits
decltype(test{}(0, ::std::declval< Args >()...)) result
std::integral_constant< bool, std::is_convertible< typename result::_::type, Ret >::value||std::is_same< Ret, void >::value > type
auto operator()(...) const -> substitution_failure
typename pmd< Pmd >::class_type class_t
auto operator()(long,...) const -> substitution_failure
auto operator()(int, U &&u) const -> success< decltype(std::declval< Obj >().*std::declval< Pmd >())>
typename pmf< Pmf >::class_type class_t
auto operator()(long,...) const -> substitution_failure
auto operator()(int, U &&u, Rgs &&... rgs) const -> success< decltype((std::declval< Obj >().*std::declval< Pmf >())(static_cast< Rgs && >(rgs)...))>
auto operator()(int, Rgs &&... rgs) const -> success< decltype(std::declval< U >()(static_cast< Rgs && >(rgs)...))>
auto operator()(long,...) const -> substitution_failure