Consider: struct S(T...) { } void fun(T1, T2...)(S!(T1) a, S!(T2) b) { } void main() { S!(string) s1; S!(int, bool) s2; fun(s1, s2); } The example fails to compile, but it works and should associate the two parameters accordingly. (It does work without variadics.)