
On Tue, 02 Oct 2007 12:24:47 +0200, Marco Costalba <mcostalba@gmail.com> wrote: skip
I could write directly
skip
typedef overload_function<final, derived, head> type; typedef tuples::cons<head, tuple<> > cons; };
Maybe you should replace tuple<> with tuples::null_type ... skip
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...
... but I don't know if this is the only problem. However your last changes makes the code too complicated, IMO. I made up a metafunction called wrapper that should do the work. examples: (1) typedef tuple<int, double, char> fund_types; typedef wrapper<fund_types, vector>::type vectors; BOOST_STATIC_ASSERT(( is_same< vectors, cons<vector<int>, cons<vector<double>, cons<vector<char>, null_type > > > > )); (2) typedef tuple< int(char) , double(int, char) , char(std::string) > signatures; typedef wrapper<signatures, boost::function>::type functions; BOOST_STATIC_ASSERT(( is_same< functions, cons<function<int(char)>, cons<function<double(int, char)>, cons<function<char(std::string)>, null_type > > > > )); Here follow the code for the metafunction: namespace boost { namespace detail { template< typename Seq, template<typename > class TT, unsigned int N = tuples::length<Seq>::value
struct wrapper { typedef typename Seq::head_type head; typedef typename Seq::tail_type tail; typedef TT<head> new_head; typedef typename wrapper<tail, TT>::type new_tail; typedef tuples::cons< new_head, new_tail > type; }; template< typename Seq, template<typename > class TT> struct wrapper<Seq, TT, 0> { typedef tuples::null_type type; }; } } // end namespaces I used it inside the overload struct replacing the code: typedef typename tuples::element<0, Seq>::type Sig0; typedef typename tuples::element<1, Seq>::type Sig1; typedef typename tuples::element<2, Seq>::type Sig2; typedef typename tuples::element<3, Seq>::type Sig3; typedef tuple< boost::function<Sig0> , boost::function<Sig1> , boost::function<Sig2> , boost::function<Sig3> > functions_type; with a single line : typedef typename detail::wrapper<Seq, boost::function>::type functions_type; ... and all seems to work correctly. I tested it with gcc 4.1.2 and boost 1.33.1 under linux. Moreover the wrapper metafunction can be used in other context too. The question is : it's ok to use cons< cons < ... >, ..., null_type > instead of tuple type ? Regards, Marco Cecchetti -- Using Opera's revolutionary e-mail client: http://www.opera.com/mail/