Something simpler is enough for my purposes, to tell that a type is one instantiation of Foo or not:
struct Foo(T...) {} struct Bar(T...) {} template IsFoo(S) { // ? } void main() { alias Foo!(int,int,int) S1; alias Foo!(float,int,int,int) S2; alias Bar!(float,int,int,int) S3; static assert(IsFoo!S1); static assert(IsFoo!S2); static assert(!IsFoo!S3); } Bye, bearophile