#include <boost/mpl/or.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/function_types/result_type.hpp>
template<class T, class R=void> struct enable_if_type { typedef R type; };
namespace details
{
//////////////////////////////////////////////////////////////////////////
// Is result_type defined in a given type ?
//////////////////////////////////////////////////////////////////////////
BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type)
//////////////////////////////////////////////////////////////////////////
// Is a inner result struct defined in a given type ?
//////////////////////////////////////////////////////////////////////////
template<class F, class FArgs, class Enable=void>
struct result_defined
: boost::mpl::false_ {};
template<class F, class Args>
struct result_defined< F
, Args
, typename enable_if_type<
typename F::template result<Args>::type
>::type
>
: boost::mpl::true_ {};
}
template<class T, class Enable=void>
struct is_result_of_supported : public boost::mpl::false_ {};
template<class T>
struct is_result_of_supported<T, typename boost::enable_if_c<
boost::mpl::or_< details::has_result_type<
typename boost::function_types::result_type<T>::type
>
, details::result_defined<
typename boost::function_types::result_type<T>::type,T
>
>::value
>::type
> : boost::mpl::true_ {};