
I am interested in tag dispatching in a generic function depending on whether the passed in argument is arity 1 or 2. My problem is that I want to have a generic expectation operator that is passed in a function to take the expectation over, and a distribution for the integration. The expectation needs to support both real and mixed-integer measures and functions. Consider the following functions it should work with: struct my_real_functor { template<std::size_t N> double operator()(ublas::bounded_vector<double,N>& x) {...} }; template<std::size_t N> double my_real_function(ublas::bounded_vector<double,N>& x) {...} struct my_mixed_functor { template<std::size_t RealN, std::size_t IntN> double operator()(ublas::bounded_vector<double,RealN>& real_x, ublas::bounded_vector<int,RealN>& int_x) {...} }; .... naturally, part of the problem is that the functor could have both specializations, so I recognize this might be tricky. If both are on a functor, then I can default to one of the implementations(probably the unary) for the matching. --------------------------------------------------- For the operator itself, the signature would be something like. <class F, class Distribution> double expectation(F f, const Distribution& dist) { .....// tag dispatch depending on F arity, or something similar. } ..... or even better: <class F, class Distribution> double expectation(mpl::enable_if<has_unary,F>::type f, const Distribution& dist) { .....//unary implementation } <class F, class Distribution> double expectation(mpl::enable_if<has_binary,F>::type f, const Distribution& dist) { .....// binary implementation. } .... or even better if I could fully match the signatures of the passed in F for conformance. ------------------------------------------------------ I looked at boost function_traits but it doesn't work with member functors.... http://www.boost.org/doc/libs/1_39_0/libs/type_traits/doc/html/boost_typetra... Any ideas on how best to implement this? Thanks as always, Jesse