1 /* 2 3 @Copyright Barrett Adair 2015-2017 4 Distributed under the Boost Software License, Version 1.0. 5 (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) 6 7 */ 8 9 #ifndef BOOST_CLBL_TRTS_IS_INVOCABLE_HPP 10 #define BOOST_CLBL_TRTS_IS_INVOCABLE_HPP 11 12 #include <boost/callable_traits/detail/core.hpp> 13 #include <boost/callable_traits/detail/is_invocable_impl.hpp> 14 15 namespace boost { namespace callable_traits { 16 17 //[ is_invocable_hpp 18 /*`[section:ref_is_invocable is_invocable] 19 [heading Header] 20 ``#include <boost/callable_traits/is_invocable.hpp>`` 21 [heading Definition] 22 */ 23 24 // inherits from either std::true_type or std::false_type 25 template<typename T, typename... Args> 26 struct is_invocable; 27 28 // inherits from either std::true_type or std::false_type 29 template<typename Ret, typename T, typename... Args> 30 struct is_invocable_r; 31 32 //<- 33 template<typename T, typename... Args> 34 struct is_invocable : detail::is_invocable_impl<T, Args...>::type { 35 using type = typename detail::is_invocable_impl<T, Args...>::type; 36 }; 37 38 template<typename Ret, typename T, typename... Args> 39 struct is_invocable_r 40 : detail::is_invocable_r_impl< 41 typename detail::is_invocable_impl<T, Args...>::type, Ret, T, Args...>::type 42 { 43 using type = typename detail::is_invocable_r_impl< 44 typename detail::is_invocable_impl<T, Args...>::type, Ret, T, Args...>::type; 45 }; 46 47 #ifdef BOOST_CLBL_TRTS_DISABLE_VARIABLE_TEMPLATES 48 49 template<typename T, typename... Args> 50 struct is_invocable_v { 51 static_assert(std::is_same<T, detail::dummy>::value, 52 "Variable templates not supported on this compiler."); 53 }; 54 55 template<typename Ret, typename T, typename... Args> 56 struct is_invocable_r_v { 57 static_assert(std::is_same<T, detail::dummy>::value, 58 "Variable templates not supported on this compiler."); 59 }; 60 61 #else 62 //-> 63 // only available when variable templates are supported 64 template<typename T, typename... Args> 65 //<- 66 BOOST_CLBL_TRAITS_INLINE_VAR 67 //-> 68 constexpr bool is_invocable_v = //see below 69 //<- 70 detail::is_invocable_impl<detail::traits<T>, Args...>::type::value; 71 //-> 72 73 // only available when variable templates are supported 74 template<typename Ret, typename T, typename... Args> 75 //<- 76 BOOST_CLBL_TRAITS_INLINE_VAR 77 //-> 78 constexpr bool is_invocable_r_v = //see below 79 //<- 80 detail::is_invocable_r_impl< 81 typename detail::is_invocable_impl<T, Args...>::type, 82 Ret, T, Args...>::type::value; 83 #endif 84 85 }} // namespace boost::callable_traits 86 //-> 87 88 /*` 89 [heading Constraints] 90 * none 91 92 [heading Behavior] 93 * standalone c++11 implementation of c++17 `std::is_invocable`, `std::is_invocable_r` 94 [note ref-qualified overloads of `operator()` with different signatures are not handled correctly yet.] 95 96 [heading Example Program] 97 [import ../example/is_invocable.cpp] 98 [is_invocable] 99 [endsect] 100 */ 101 //] 102 103 #endif // #ifndef BOOST_CLBL_TRTS_IS_INVOCABLE_HPP 104