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