
On 11/23/2011 04:33 PM, Allan Nielsen wrote:
It might be me which does not understand it, but as I read the documentation funciton_types is for manipulating functions pointers, not to manage template arguments...
Please correct me if I'm wrong Okay, I got it...<int(int)> is one template argument... : typename boost::function_types::result_type<T0>::type is the return type, and I can use parameter_types and MPL to iterate over the parameters. Clever..
But how do I implement the call interface:
template<typename T> struct IfCall { typedef typename boost::function_types::result_type<T0>::type R;
R call( /* T0, T1, T2...*/ ) { // can I get the MPL sequence into the method signature?? } };
You need to use the preprocessor for this; in that case, you can also get rid of Boost.FunctionTypes. #include <boost/preprocessor/repetition/repeat.hpp> #include <boost/preprocessor/repetition/enum_params.hpp> #include <boost/preprocessor/repetition/enum_binary_params.hpp> #include <boost/preprocessor/punctuation/comma_if.hpp> #define IFCALL_MAX_ARITY 5 template<class Sig> struct IfCall; #define M0(z, n, t) \ template<class R BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class A)>\ struct IfCall<R(BOOST_PP_ENUM_PARAMS(n, A))> \ { \ R call(BOOST_PP_ENUM_BINARY_PARAMS(n, A, const& a)) \ { \ return R(); \ } \ }; \ /**/ BOOST_PP_REPEAT(BOOST_PP_INC(IFCALL_MAX_ARITY), M0, ~) #undef M0