template AliasSeq(T...) { alias AliasSeq = T; } template Unqual(T) { static if (is(T U == const U)) alias Unqual = U; else static if (is(T U == immutable U)) alias Unqual = U; else alias Unqual = T; } template staticMap(alias F, T...) { alias A = AliasSeq!(); static foreach (t; T) A = AliasSeq!(A, F!t); // what's tested alias staticMap = A; } alias TK = staticMap!(Unqual, int, const uint); //pragma(msg, TK); static assert(is(TK == AliasSeq!(int, uint))); /**************************************************/ template reverse(T...) { alias A = AliasSeq!(); static foreach (t; T) A = AliasSeq!(t, A); // what's tested alias reverse = A; } enum X2 = 3; alias TK2 = reverse!(int, const uint, X2); //pragma(msg, TK2); static assert(TK2[0] == 3); static assert(is(TK2[1] == const(uint))); static assert(is(TK2[2] == int));