class Bar (T) {} static if (is (Bar!(int) T == T!(U), U)) // should evaluate to true, U == int, T == ? probably Bar!(int) {} class Foo : Bar!(int) {} static if (is (Foo T == T!(U), U)) // should evaluate to false {} static if (is (Foo T : T!(U), U)) // should evaluate to true, U == int {} Currently, you can do similar stuff in template specializations, but it should be extended to IsExpressions, according to the documentation. So it's implied, anyway.
The syntax was slightly wrong. Using correct syntax, as shown below, it failed on all versions of DMD up to and including 2.048. It was fixed in 2.049. class Bar (T) {} static if (is (Bar!(int) T == W!(U), alias W, U)) { pragma(msg, W.stringof); pragma(msg, U.stringof); } else static assert(0); class Foo : Bar!(int) {} static if (is (Foo T == W!(U), alias W, U)) { static assert(0); } static if (is (Foo T2 : W2!(U2), alias W2, U2)) { pragma(msg, W2.stringof); pragma(msg, U2.stringof); } else static assert(0);
See also bug 3608, which is definitely related, but concerns variadic template lists.