
Alexander Nasonov wrote:
I have one addition to '[type_traits] "member_function_pointer_traits" ?' thread started long time ago (29 Jul 2004) by Tobias Schwinger. Is it makes sense to modify as_sequence to convert function type into a sequence? Eg: as_sequence<R (T0,T1)> ---> vector<R,T0,T1> as_sequence<R(*)(T0,T1)> ---> vector<R,T0,T1> as_sequence<R(&)(T0,T1)> ---> vector<R,T0,T1>
as_sequence<R(C::*)(T0,T1)> ---> vector<R,C,T0,T1>
as_sequence<R(T0,T1)> reads great, but this would add a lot to the complexity of 'as_sequence': First we have to idenitify if T is some sort of function (ptr/ref) type. Although there are ways to detect (not decompose, that is) functions and even member function pointers without using an unrolled cascades of specializations for different function arities, it requires a very standard compliant compiler. As we need to decompose the type and wrap its components into a vector in case it turns out to be a function anyway, we will instantiate one of these (more than 100) specializations. Note that in order to do all this a big chunk of code needs to be included and processed (the unrolled cascade of specializations to identify/decompose the function type and the cascade of 'mpl::vector' up to the maximum arity supported). This can significantly slow down the compilation time of a project (especially when separated into a lot of small translation units or when 'as_sequence' is used often). It may not be a good idea to impose these disadvantages on a "mostly harmless" user, probably not wanting to use this feature at all ;+). However there is a possiblility to give control to the user: As template specializations "slip through" to the namespace using them, a "dumb stub" could be added to 'as_sequence', never reporting that a type is a function. It could be "filled with life" afterwards when the user includes another header to enable 'as_sequence' for function types. Still I am not too sure this is a good idea. Comments about interest in this would be very helpful ! While we're at it - and in case you want to contribute to it: My work on this in the files section is up to date and has been updated just recently. Currently function_pointer_signature<R(*)(T0,T1)>::type is vector<T0,T1> function_pointer_signature<R(C::*)(T0,T1)>::type is vector<C,T0,T1> function_pointer_result<FuncPtr>::type is R (in both cases) Best regards, Tobias