Boost logo

Boost :

From: Dean Michael Berris (mikhailberis_at_[hidden])
Date: 2007-01-10 02:53:26

I was looking at the function_traits implementation in the Boost CVS,
and saw that it might benefit from adding a tuple-like interface to
the function_traits type. I'm thinking along the lines of:

typedef function_traits<void(int,char,bool)> sample_trait;
at_c<sample_trait::args, 1>::type a; // char
at_c<sample_trait::args, 3>::type b; // error, out of bounds ?

typedef function_traits<void( tuple<int, char, bool> , std::string )>
at< typename at_c<another_sample::args, 0>::type, 0 >::type c; // int

Perhaps adding a mpl::vector or a fusion::vector element 'args' can
greatly improve the kinds of things that can be done with the
function_traits<>, especially in libraries aiming to become more
flexible when it comes to argument pack handling.

I got the idea because I found myself needing a generic way of
defining a tuple from the argument list of a signatures passed to
function_traits<>. That's a pretty simple use case, but I found myself
having to do some repetitive overloads to accommodate the 10
variations of function_traits using just the function_traits<>::arity
element, and then having to do PP magic to iterate through the
`argN_type' typedefs.

With the additional `args' fusion/mpl vector in function_traits<>, it
wouldn't have to be a concern since it already packs the types of the
arguments. Defining operations over args could very well be a simple
exercise in template metaprogramming.

If anybody's interested, it's a pretty trivial patch attached.

Dean Michael C. Berris
mikhailberis AT gmail DOT com
+63 928 7291459

Boost list run by bdawes at, gregod at, cpdaniel at, john at