#if !defined(GENERATE_OVERLOADED_HEADER) #define GENERATE_OVERLOADED_HEADER #include #include #include #include #define GENERATE_OVERLOADED(return_type, function_name, object_name) \ namespace GENERATE_DETAIL \ { \ template \ struct BOOST_PP_CAT(object_name, _type) \ { \ typedef ResultType result_type; \ public: \ template \ result_type operator()(T1 const& p1) const \ { \ return function_name(p1); \ } \ \ template \ result_type operator()(T1 const& p1, T2 const& p2) const \ { \ return function_name(p1, p2); \ } \ \ BOOST_PP_REPEAT_FROM_TO_1(3, 10, \ GENERATE_OVERLOADED_FUNCTION, function_name) \ }; \ } \ namespace \ { \ GENERATE_DETAIL::BOOST_PP_CAT(object_name, _type) \ object_name, _type; \ } #define GENERATE_OVERLOADED_FUNCTION(z, num, name) \ template < BOOST_PP_ENUM_PARAMS_Z(z, num, class T) > \ result_type operator()( \ BOOST_PP_ENUM_BINARY_PARAMS_Z(z, num, T, const& p) \ ) const \ { \ return name(BOOST_PP_ENUM_PARAMS_Z(z, num, p)); \ } #endif // arch-tag: f8a0c3b5-2de8-48d6-9fe0-9bb79c926c4d