1 /*=============================================================================
2     Copyright (c) 2014 Paul Fultz II
3     is_invocable.h
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 
8 #ifndef BOOST_HOF_GUARD_IS_CALLABLE_H
9 #define BOOST_HOF_GUARD_IS_CALLABLE_H
10 
11 /// is_invocable
12 /// ===========
13 ///
14 /// Description
15 /// -----------
16 ///
17 /// The `is_invocable` metafunction checks if the function is callable with
18 /// certain parameters.
19 ///
20 /// Requirements
21 /// ------------
22 ///
23 /// F must be:
24 ///
25 /// * [Invocable](Invocable)
26 ///
27 /// Synopsis
28 /// --------
29 ///
30 ///     template<class F, class... Ts>
31 ///     struct is_invocable;
32 ///
33 /// Example
34 /// -------
35 ///
36 ///     #include <boost/hof.hpp>
37 ///     using namespace boost::hof;
38 ///
39 ///     struct is_invocable_class
40 ///     {
41 ///         void operator()(int) const
42 ///         {
43 ///         }
44 ///     };
45 ///     static_assert(is_invocable<is_invocable_class, int>(), "Not callable");
46 ///
47 ///     int main() {}
48 ///
49 
50 
51 #include <boost/hof/detail/can_be_called.hpp>
52 #include <boost/hof/apply.hpp>
53 
54 namespace boost { namespace hof {
55 
56 template<class F, class... Ts>
57 struct is_invocable
58 : detail::can_be_called<detail::apply_f, F, Ts...>
59 {};
60 
61 template<class F, class... Ts, class... Us>
62 struct is_invocable<F(Ts...), Us...>
63 {
64     static_assert(!std::is_same<F, F>::value,
65         "The is_invocable<F(Args...)> form is not supported because it is problematic."
66         "Please use is_invocable<F, Args...> instead."
67     );
68 };
69 
70 }} // namespace boost::hof
71 
72 #endif
73