is_invocable.hpp
Go to the documentation of this file.
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 
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>
35  using type = typename detail::is_invocable_impl<T, Args...>::type;
36 };
37 
38 template<typename Ret, typename T, typename... Args>
41  typename detail::is_invocable_impl<T, Args...>::type, Ret, T, Args...>::type
42 {
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 //<-
67 //->
68 constexpr bool is_invocable_v = //see below
69 //<-
70  detail::is_invocable_impl<T, Args...>::type::value;
71 //->
72 
73 // only available when variable templates are supported
74 template<typename Ret, typename T, typename... Args>
75 //<-
77 //->
78 constexpr bool is_invocable_r_v = //see below
79 //<-
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
#define BOOST_CLBL_TRAITS_INLINE_VAR
Definition: config.hpp:27
constexpr BOOST_CLBL_TRAITS_INLINE_VAR bool is_invocable_r_v
constexpr BOOST_CLBL_TRAITS_INLINE_VAR bool is_invocable_v
typename detail::is_invocable_r_impl< typename detail::is_invocable_impl< T, Args... >::type, Ret, T, Args... >::type type
typename detail::is_invocable_impl< T, Args... >::type type