diff --git a/include/boost/fusion/functional/invocation/invoke.hpp b/include/boost/fusion/functional/invocation/invoke.hpp index e1373542..b79ff5b4 100644 --- a/include/boost/fusion/functional/invocation/invoke.hpp +++ b/include/boost/fusion/functional/invocation/invoke.hpp @@ -41,6 +41,7 @@ #include #include +#include #include #include #include @@ -52,29 +53,10 @@ namespace boost { namespace fusion { - //~ namespace result_of - //~ { - //~ template - //~ struct invoke; - //~ } - - //~ template - //~ inline typename result_of::invoke::type - //~ invoke(Function, Sequence &); - - //~ template - //~ inline typename result_of::invoke::type - //~ invoke(Function, Sequence const &); - - //----- ---- --- -- - - - - - namespace detail { namespace ft = function_types; - template struct always_void_ { typedef T type; }; - template< typename Function, class Sequence, int N = result_of::size::value, @@ -161,14 +143,20 @@ namespace boost { namespace fusion namespace result_of { - template ::type, Sequence - >::result_type> - struct invoke + template + struct invoke; + + template + struct invoke::type, Sequence + >::result_type + >::type> { - typedef Enable type; + typedef typename detail::invoke_impl< + typename boost::remove_reference::type, Sequence + >::result_type type; }; } @@ -207,7 +195,7 @@ namespace boost { namespace fusion template struct invoke_impl::type >::type> { @@ -301,7 +289,7 @@ namespace boost { namespace fusion template struct invoke_impl::BOOST_PP_CAT(T, j) typename boost::result_of::type >::type> diff --git a/include/boost/fusion/functional/invocation/invoke_function_object.hpp b/include/boost/fusion/functional/invocation/invoke_function_object.hpp index 6d414f55..3ed508dd 100644 --- a/include/boost/fusion/functional/invocation/invoke_function_object.hpp +++ b/include/boost/fusion/functional/invocation/invoke_function_object.hpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -34,29 +35,13 @@ namespace boost { namespace fusion { - namespace result_of - { - template struct invoke_function_object; - } - - template - BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - inline typename result_of::invoke_function_object::type - invoke_function_object(Function, Sequence &); - - template - BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - inline typename result_of::invoke_function_object::type invoke_function_object(Function, Sequence const &); - - //----- ---- --- -- - - - - - namespace detail { template< class Function, class Sequence, int N = result_of::size::value, - bool RandomAccess = traits::is_random_access::value + bool RandomAccess = traits::is_random_access::value, + typename Enable = void > struct invoke_function_object_impl; @@ -72,7 +57,16 @@ namespace boost { namespace fusion namespace result_of { - template struct invoke_function_object + template + struct invoke_function_object; + + template + struct invoke_function_object::type, Sequence + >::result_type + >::type> { typedef typename detail::invoke_function_object_impl< typename boost::remove_reference::type, Sequence @@ -111,14 +105,18 @@ namespace boost { namespace fusion /////////////////////////////////////////////////////////////////////////////// #define N BOOST_PP_ITERATION() +#define M(z,j,data) \ + typename result_of::at_c::type + template - struct invoke_function_object_impl + struct invoke_function_object_impl::type + >::type> { public: typedef typename boost::result_of< -#define M(z,j,data) \ - typename result_of::at_c::type Function (BOOST_PP_ENUM(N,M,~)) >::type result_type; #undef M @@ -148,8 +146,15 @@ namespace boost { namespace fusion }; +#define M(z,j,data) \ + typename invoke_function_object_param_types::T ## j + template - struct invoke_function_object_impl + struct invoke_function_object_impl::type + >::type> +#undef M { private: typedef invoke_function_object_param_types seq; diff --git a/include/boost/fusion/functional/invocation/invoke_procedure.hpp b/include/boost/fusion/functional/invocation/invoke_procedure.hpp index 028e0fe3..a0fe73a6 100644 --- a/include/boost/fusion/functional/invocation/invoke_procedure.hpp +++ b/include/boost/fusion/functional/invocation/invoke_procedure.hpp @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -38,24 +39,6 @@ namespace boost { namespace fusion { - namespace result_of - { - template struct invoke_procedure - { - typedef void type; - }; - } - - template - BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - inline void invoke_procedure(Function, Sequence &); - - template - BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - inline void invoke_procedure(Function, Sequence const &); - - //----- ---- --- -- - - - - - namespace detail { namespace ft = function_types; @@ -76,9 +59,27 @@ namespace boost { namespace fusion } + namespace result_of + { + template + struct invoke_procedure; + + template + struct invoke_procedure::type,Sequence + >::result_type + >::type> + { + typedef void type; + }; + } + template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - inline void invoke_procedure(Function f, Sequence & s) + inline typename result_of::invoke_procedure::type + invoke_procedure(Function f, Sequence & s) { detail::invoke_procedure_impl< typename boost::remove_reference::type,Sequence @@ -87,7 +88,8 @@ namespace boost { namespace fusion template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - inline void invoke_procedure(Function f, Sequence const & s) + inline typename result_of::invoke_procedure::type + invoke_procedure(Function f, Sequence const & s) { detail::invoke_procedure_impl< typename boost::remove_reference::type,Sequence const @@ -110,6 +112,7 @@ namespace boost { namespace fusion template struct invoke_procedure_impl { + typedef void result_type; #if N > 0 @@ -135,6 +138,8 @@ namespace boost { namespace fusion template struct invoke_procedure_impl { + typedef void result_type; + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline void call(Function & f, Sequence & s) { @@ -155,6 +160,7 @@ namespace boost { namespace fusion template struct invoke_procedure_impl { + typedef void result_type; #if N > 0 @@ -182,6 +188,8 @@ namespace boost { namespace fusion template struct invoke_procedure_impl { + typedef void result_type; + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline void call(Function & f, Sequence & s) { diff --git a/include/boost/fusion/support/detail/enabler.hpp b/include/boost/fusion/support/detail/enabler.hpp new file mode 100644 index 00000000..48b69f32 --- /dev/null +++ b/include/boost/fusion/support/detail/enabler.hpp @@ -0,0 +1,18 @@ +/*============================================================================= + Copyright (c) 2015 Kohei Takahashi + + Use modification and distribution are subject to the Boost Software + License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at + http://www.boost.org/LICENSE_1_0.txt). +==============================================================================*/ +#ifndef FUSION_DETAIL_ENABLER_02082015_163810 +#define FUSION_DETAIL_ENABLER_02082015_163810 + +namespace boost { namespace fusion { namespace detail +{ + template + struct enabler { typedef T type; }; +}}} + +#endif + diff --git a/test/compile_time/sfinae_friendly.hpp b/test/compile_time/sfinae_friendly.hpp new file mode 100644 index 00000000..77b148b8 --- /dev/null +++ b/test/compile_time/sfinae_friendly.hpp @@ -0,0 +1,54 @@ +/*============================================================================= + Copyright (c) 2015 Kohei Takahashi + + Use modification and distribution are subject to the Boost Software + License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at + http://www.boost.org/LICENSE_1_0.txt). +==============================================================================*/ + +#ifndef FUSION_TEST_SFINAE_FRIENDLY_HPP +#define FUSION_TEST_SFINAE_FRIENDLY_HPP + +#include +#include +#include +#include + +#if !defined(BOOST_NO_SFINAE) && !defined(BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF) + +#include + +namespace sfinae_friendly +{ + template struct void_ { typedef T type; }; + + template struct arg_; + template struct arg_ { typedef T type; }; + + template + struct check + : boost::mpl::true_ { }; + + template + struct check::type> + : boost::mpl::false_ { }; + + struct unspecified {}; + typedef boost::fusion::vector<> v0; + typedef boost::fusion::vector v1; + typedef boost::fusion::vector v2; + typedef boost::fusion::vector v3; +} + +#define SFINAE_FRIENDLY_ASSERT(Traits) \ + BOOST_MPL_ASSERT((::sfinae_friendly::check::type>)) + +#else + +#define SFINAE_FRIENDLY_ASSERT(Traits) \ + BOOST_MPL_ASSERT((boost::mpl::true_)) + +#endif + +#endif // FUSION_TEST_SFINAE_FRIENDLY_HPP + diff --git a/test/functional/invoke.cpp b/test/functional/invoke.cpp index fa93332c..2a94539f 100644 --- a/test/functional/invoke.cpp +++ b/test/functional/invoke.cpp @@ -31,6 +31,8 @@ #include #include +#include "../compile_time/sfinae_friendly.hpp" + namespace mpl = boost::mpl; namespace fusion = boost::fusion; @@ -80,6 +82,11 @@ struct fobj int operator()(int i, object const &, object_nc &); int operator()(int i, object const &, object_nc &) const; }; +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); + struct nullary_fobj { @@ -88,6 +95,10 @@ struct nullary_fobj int operator()() { return 0; } int operator()() const { return 1; } }; +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); + struct fobj_nc : boost::noncopyable @@ -105,6 +116,11 @@ struct fobj_nc int operator()(int i) { return 14 + i; } int operator()(int i) const { return 15 + i; } }; +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); + struct nullary_fobj_nc : boost::noncopyable @@ -114,11 +130,34 @@ struct nullary_fobj_nc int operator()() { return 12; } int operator()() const { return 13; } }; +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); + int nullary() { return 16; } int unary(int i) { return 17 + i; } int binary1(int i, object &) { return 18 + i; } int binary2(int i, object const &) { return 19 + i; } +//FIXME +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +// +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +// +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +// +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); typedef int (* func_ptr)(int); typedef int (* const c_func_ptr)(int); @@ -182,28 +221,120 @@ members that; members_ptr spt_that(new members); const_members_ptr spt_that_c(new members); -fusion::single_view sv_obj_ctx( that); -fusion::single_view sv_ref_ctx( that); -fusion::single_view sv_ptr_ctx(& that); -fusion::single_view sv_obj_c_ctx( that); -fusion::single_view sv_ref_c_ctx( that); -fusion::single_view sv_ptr_c_ctx(& that); -fusion::single_view sv_spt_ctx(spt_that); -fusion::single_view sv_spt_c_ctx(spt_that_c); +typedef fusion::single_view sv_obj; +typedef fusion::single_view sv_ref; +typedef fusion::single_view sv_ptr; +typedef fusion::single_view sv_obj_c; +typedef fusion::single_view sv_ref_c; +typedef fusion::single_view sv_ptr_c; +typedef fusion::single_view sv_spt; +typedef fusion::single_view sv_spt_c; + +sv_obj sv_obj_ctx( that); +sv_ref sv_ref_ctx( that); +sv_ptr sv_ptr_ctx(& that); +sv_obj_c sv_obj_c_ctx( that); +sv_ref_c sv_ref_c_ctx( that); +sv_ptr_c sv_ptr_c_ctx(& that); +sv_spt sv_spt_ctx(spt_that); +sv_spt_c sv_spt_c_ctx(spt_that_c); +template +struct sv_helper +{ + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); +}; +// FIXME: +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; + +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; + +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; derived derived_that; derived_ptr spt_derived_that(new derived); const_derived_ptr spt_derived_that_c(new derived); -fusion::single_view sv_obj_d_ctx( derived_that); -fusion::single_view sv_ref_d_ctx( derived_that); -fusion::single_view sv_ptr_d_ctx(& derived_that); -fusion::single_view sv_obj_c_d_ctx( derived_that); -fusion::single_view sv_ref_c_d_ctx( derived_that); -fusion::single_view sv_ptr_c_d_ctx(& derived_that); -fusion::single_view sv_spt_d_ctx(spt_derived_that); -fusion::single_view sv_spt_c_d_ctx(spt_derived_that_c); +typedef fusion::single_view sv_obj_d; +typedef fusion::single_view sv_ref_d; +typedef fusion::single_view sv_ptr_d; +typedef fusion::single_view sv_obj_c_d; +typedef fusion::single_view sv_ref_c_d; +typedef fusion::single_view sv_ptr_c_d; +typedef fusion::single_view sv_spt_d; +typedef fusion::single_view sv_spt_c_d; + +sv_obj_d sv_obj_d_ctx( derived_that); +sv_ref_d sv_ref_d_ctx( derived_that); +sv_ptr_d sv_ptr_d_ctx(& derived_that); +sv_obj_c_d sv_obj_c_d_ctx( derived_that); +sv_ref_c_d sv_ref_c_d_ctx( derived_that); +sv_ptr_c_d sv_ptr_c_d_ctx(& derived_that); +sv_spt_d sv_spt_d_ctx(spt_derived_that); +sv_spt_c_d sv_spt_c_d_ctx(spt_derived_that_c); +template +struct sv_d_helper +{ + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); +}; +// FIXME: +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; + +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; + +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; template void test_sequence_n(Sequence & seq, mpl::int_<0>) @@ -317,7 +448,6 @@ void test_sequence_n(Sequence & seq, mpl::int_<1>) BOOST_TEST(that.unary_c(element1) == fusion::invoke(& members::unary_c, fusion::join(sv_ref_c_d_ctx,seq))); BOOST_TEST(that.unary_c(element1) == fusion::invoke(& members::unary_c, fusion::join(sv_ptr_c_d_ctx,seq))); BOOST_TEST(that.unary_c(element1) == fusion::invoke(& members::unary_c, fusion::join(sv_spt_c_d_ctx,seq))); - } template diff --git a/test/functional/invoke_function_object.cpp b/test/functional/invoke_function_object.cpp index d618a495..7c75f06d 100644 --- a/test/functional/invoke_function_object.cpp +++ b/test/functional/invoke_function_object.cpp @@ -30,6 +30,8 @@ #include #include +#include "../compile_time/sfinae_friendly.hpp" + namespace mpl = boost::mpl; namespace fusion = boost::fusion; @@ -82,6 +84,9 @@ struct fobj int operator()(int i, object const &, object_nc &); int operator()(int i, object const &, object_nc &) const; }; +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); struct nullary_fobj { @@ -90,6 +95,9 @@ struct nullary_fobj int operator()() { return 0; } int operator()() const { return 1; } }; +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); struct fobj_nc : boost::noncopyable @@ -107,6 +115,10 @@ struct fobj_nc int operator()(int i) { return 14 + i; } int operator()(int i) const { return 15 + i; } }; +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); struct nullary_fobj_nc : boost::noncopyable @@ -116,6 +128,9 @@ struct nullary_fobj_nc int operator()() { return 12; } int operator()() const { return 13; } }; +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); typedef int element1_type; diff --git a/test/functional/invoke_procedure.cpp b/test/functional/invoke_procedure.cpp index 2ee8354d..3877ca30 100644 --- a/test/functional/invoke_procedure.cpp +++ b/test/functional/invoke_procedure.cpp @@ -29,6 +29,8 @@ #include #include +#include "../compile_time/sfinae_friendly.hpp" + namespace mpl = boost::mpl; namespace fusion = boost::fusion; @@ -78,14 +80,60 @@ members that; members_ptr spt_that(new members); const_members_ptr spt_that_c(new members); -fusion::single_view sv_obj_ctx( that); -fusion::single_view sv_ref_ctx( that); -fusion::single_view sv_ptr_ctx(& that); -fusion::single_view sv_obj_c_ctx( that); -fusion::single_view sv_ref_c_ctx( that); -fusion::single_view sv_ptr_c_ctx(& that); -fusion::single_view sv_spt_ctx(spt_that); -fusion::single_view sv_spt_c_ctx(spt_that_c); +typedef fusion::single_view sv_obj; +typedef fusion::single_view sv_ref; +typedef fusion::single_view sv_ptr; +typedef fusion::single_view sv_obj_c; +typedef fusion::single_view sv_ref_c; +typedef fusion::single_view sv_ptr_c; +typedef fusion::single_view sv_spt; +typedef fusion::single_view sv_spt_c; + +sv_obj sv_obj_ctx( that); +sv_ref sv_ref_ctx( that); +sv_ptr sv_ptr_ctx(& that); +sv_obj_c sv_obj_c_ctx( that); +sv_ref_c sv_ref_c_ctx( that); +sv_ptr_c sv_ptr_c_ctx(& that); +sv_spt sv_spt_ctx(spt_that); +sv_spt_c sv_spt_c_ctx(spt_that_c); +template +struct sv_helper +{ + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); +}; +// FIXME: +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; + +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; + +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; struct fobj { @@ -103,6 +151,11 @@ struct fobj int operator()(int & i, object &, object_nc &) { return i = 10; } int operator()(int & i, object &, object_nc &) const { return i = 11; } }; +// FIXME: +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); struct fobj_nc : boost::noncopyable @@ -113,11 +166,35 @@ struct fobj_nc int operator()(int & i) { return i = 14; } int operator()(int & i) const { return i = 15; } }; +// FIXME: +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); int nullary() { return element1 = 16; } int unary(int & i) { return i = 17; } int binary1(int & i, object &) { return i = 18; } int binary2(int & i, object const &) { return i = 19; } +//FIXME +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +// +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +// +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +// +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); typedef int (* func_ptr)(int &); typedef int (* const c_func_ptr)(int &);