huh, interesting. I though the implementation basically did
template<typename T> struct function { };
template<typename R, typename A, typename B> struct function<R (A,B)> : real_function<R, TYPELIST(A,B)>
template<typename R, typename A, typename B,typename C> struct function<R (A,B,C)> : real_function<R, TYPELIST(A,B,C)>
template<typename R, typename A, typename B,typename C,typename D> struct function<R (A,B,C,D)> : real_function<R, TYPELIST(A,B,C,D)>
...
and so-on in that matter for a silly number of implementations. Maybe I'm thinking of Loki or something else but this is definitely a way it can be simulated...
Either way, my point that it's all made infinitely simpler and cleaner looking by variadic templates remains