williamr@2: // Boost result_of library williamr@2: williamr@2: // Copyright Douglas Gregor 2004. Use, modification and williamr@2: // distribution is subject to the Boost Software License, Version williamr@2: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: williamr@2: // For more information, see http://www.boost.org/libs/utility williamr@2: #ifndef BOOST_RESULT_OF_HPP williamr@2: #define BOOST_RESULT_OF_HPP williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #ifndef BOOST_RESULT_OF_NUM_ARGS williamr@2: # define BOOST_RESULT_OF_NUM_ARGS 10 williamr@2: #endif williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: template struct result_of; williamr@2: williamr@2: #if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) williamr@2: namespace detail { williamr@2: williamr@2: BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type) williamr@2: williamr@2: template struct get_result_of; williamr@2: williamr@2: template williamr@2: struct get_result_of williamr@2: { williamr@2: typedef typename F::result_type type; williamr@2: }; williamr@2: williamr@2: template williamr@2: struct get_result_of williamr@2: { williamr@2: typedef typename F::template result::type type; williamr@2: }; williamr@2: williamr@2: template williamr@2: struct get_result_of williamr@2: { williamr@2: typedef void type; williamr@2: }; williamr@2: williamr@2: template williamr@2: struct result_of : get_result_of::value)> {}; williamr@2: williamr@2: } // end namespace detail williamr@2: williamr@2: #define BOOST_PP_ITERATION_PARAMS_1 (3,(0,BOOST_RESULT_OF_NUM_ARGS,)) williamr@2: #include BOOST_PP_ITERATE() williamr@2: williamr@2: #else williamr@2: # define BOOST_NO_RESULT_OF 1 williamr@2: #endif williamr@2: williamr@2: } williamr@2: williamr@2: #endif // BOOST_RESULT_OF_HPP