
On 10/2/07, Joel de Guzman <joel@boost-consulting.com> wrote:
Ok, your call, since you're the one taking the challenge anyway :)
I have tried to remove the dependancy from mpl library and perhaps I have found a nice way to do it. The key idea is to use the deinitions of tuple<A, B, C, D> that is (perhaps) a cons<A, cons<B, cons<C, cons<D, null_type> > > > So instead of the following previous code: namespace detail { template <typename Seq, typename derived, int n, int size> struct do_compose { typedef typename Seq::head_type head; typedef typename Seq::tail_type tail; typedef typename do_compose<tail, derived, n - 1, size>::type ov; typedef overload_function<ov, derived, head> type; }; template <typename Seq, typename derived, int size> struct do_compose<Seq, derived, 1, size> { typedef typename Seq::head_type head; typedef overload_function<final_overload_function<size>, derived, head> type; }; template <typename Seq> struct compose_overload_base { enum { n = tuples::length<Seq>::value }; typedef overload<Seq> derived; typedef typename do_compose<Seq, derived, n, n>::type type; }; struct get_function { template <typename T> struct apply { typedef boost::function<T> type; }; }; } template <typename Seq> struct overload : detail::compose_overload_base<Seq>::type { typedef typename boost::mpl:: transform<Seq, detail::get_function>::type functions_type; functions_type functions; }; I could write directly namespace detail { template <typename Seq, typename derived, int n, int size> struct do_compose { typedef typename Seq::head_type head; typedef typename Seq::tail_type tail; typedef do_compose<tail, derived, n - 1, size> next; typedef typename next::type ov; typedef typename next::cons cons_tail; typedef overload_function<ov, derived, head> type; typedef tuples::cons<boost::function<head>, cons_tail> cons; }; template <typename Seq, typename derived, int size> struct do_compose<Seq, derived, 1, size> { typedef typename Seq::head_type head; typedef final_overload_function<size> final; typedef overload_function<final, derived, head> type; typedef tuples::cons<head, tuple<> > cons; }; template <typename Seq> struct compose_overload_base : do_compose< Seq, overload<Seq>, tuples::length<Seq>::value, tuples::length<Seq>::value > {}; } template <typename Seq> struct overload : detail::compose_overload_base<Seq>::type { typedef detail::compose_overload_base<Seq> Base; typedef typename Base::cons functions_type; functions_type functions; // COMPILE ERROR HERE }; But I have an error as soon as I try to instantiate 'functions_type' The compile error seems very internal to tuple library and an help on how to come up with this would be very apreciated... Thanks a lot for your patience (I'm a newbie) Marco