#include "curryable.hpp" #include #include template struct type_u { type_u() { std::cout<<"type_u<"<()\n"; } type_u(type_u const&) { std::cout<<"type_u<"<(type_u const&)\n"; } }; template std::ostream& operator<< ( std::ostream& sout , type_uconst& x ) { sout<<"sout<\n"; return sout; } #define PRINT_TYPE_US_ARITY 3 #define TYPE_U_ARGS_DECL(Z, N, D) type_u< N >const& BOOST_PP_CAT(arg, N) #define TYPE_U_ARGS_PRINT(Z, N, D) std::cout<< BOOST_PP_CAT(arg, N); struct print_type_us { typedef void result_type ; result_type operator() ( BOOST_PP_ENUM(PRINT_TYPE_US_ARITY, TYPE_U_ARGS_DECL, ~) )const { BOOST_PP_REPEAT(PRINT_TYPE_US_ARITY, TYPE_U_ARGS_PRINT, ~) } }; template< bool B, unsigned ArgNum, unsigned Arity, typename Curryable> typename boost::enable_if_c < ArgNum+1::type test_arity(Curryable const& a_curryable) { type_u a_arg; test_arity(a_curryable(a_arg)); } template< bool B, unsigned ArgNum, unsigned Arity, typename Curryable> typename boost::enable_if_c < ArgNum+1>=Arity , void >::type test_arity(Curryable const& a_curryable) { type_u a_arg; a_curryable(a_arg); } template< bool B, unsigned Arity=PRINT_TYPE_US_ARITY> void test() { std::cout<<"test<"<:\n"; print_type_us ptu; curryable p0(ptu); test_arity(p0); } int main() { test(); test(); return 0; }