1 // Boost result_of library
3 // Copyright Douglas Gregor 2004. Use, modification and
4 // distribution is subject to the Boost Software License, Version
5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
8 // Copyright Daniel Walker, Eric Niebler, Michel Morin 2008-2012.
9 // Use, modification and distribution is subject to the Boost Software
10 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or
11 // copy at http://www.boost.org/LICENSE_1_0.txt)
13 // For more information, see http://www.boost.org/libs/utility
14 #if !defined(BOOST_PP_IS_ITERATING)
15 # error Boost result_of - do not include this file!
18 // CWPro8 requires an argument in a function type specialization
19 #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3002)) && BOOST_PP_ITERATION() == 0
20 # define BOOST_RESULT_OF_ARGS void
22 # define BOOST_RESULT_OF_ARGS BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)
25 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
26 template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
27 BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
28 struct tr1_result_of<F(BOOST_RESULT_OF_ARGS)>
30 mpl::or_< is_pointer<F>, is_member_function_pointer<F> >
31 , boost::detail::tr1_result_of_impl<
32 typename remove_cv<F>::type,
33 typename remove_cv<F>::type(BOOST_RESULT_OF_ARGS),
34 (boost::detail::has_result_type<F>::value)>
35 , boost::detail::tr1_result_of_impl<
37 F(BOOST_RESULT_OF_ARGS),
38 (boost::detail::has_result_type<F>::value)> >::type { };
41 #if !defined(BOOST_NO_DECLTYPE) && defined(BOOST_RESULT_OF_USE_DECLTYPE)
43 // Uses declval following N3225 20.7.7.6 when F is not a pointer.
44 template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
45 BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
46 struct result_of<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
48 is_member_function_pointer<F>
49 , detail::tr1_result_of_impl<
50 typename remove_cv<F>::type,
51 typename remove_cv<F>::type(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), false
53 , detail::cpp0x_result_of_impl<
54 F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))
61 template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
62 BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
63 struct cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
67 BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), declval<T, >() BOOST_PP_INTERCEPT)
74 #else // defined(BOOST_NO_DECLTYPE)
76 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
77 template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
78 BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
79 struct result_of<F(BOOST_RESULT_OF_ARGS)>
80 : tr1_result_of<F(BOOST_RESULT_OF_ARGS)> { };
83 #endif // defined(BOOST_NO_DECLTYPE)
85 #undef BOOST_RESULT_OF_ARGS
87 #if BOOST_PP_ITERATION() >= 1
91 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
92 BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
93 struct tr1_result_of_impl<R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>
98 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
99 BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
100 struct tr1_result_of_impl<R (&)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>
105 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
106 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
107 BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
108 struct tr1_result_of_impl<R (T0::*)
109 (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T)),
115 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
116 BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
117 struct tr1_result_of_impl<R (T0::*)
118 (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
125 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
126 BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
127 struct tr1_result_of_impl<R (T0::*)
128 (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
135 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
136 BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
137 struct tr1_result_of_impl<R (T0::*)
138 (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))