On 8/3/12, Zhenya <zh...@list.ru> wrote: > Huh,thank you,I understood.I just thought that by default alias > parameter is an identifier.I was surprised then I saw that > possible to pass value of variable,which is'nt enum.Could you > explain me why it is?
I think alias can be seen as "pass by name". The template gets access to a symbol whatever that symbol is (a variable, a type..). Whether or not you can instantiate the template depends on what you do inside the template, for example the following is all legal because every symbol has a .stringof property: template Test(alias symbol) { pragma(msg, symbol.stringof); } void main() { alias Test!(1) x; enum int en = 1; alias Test!(en) y; int var; alias Test!(var) z; } But if you change the template so it tries to read what the value of 'symbol' stores you will get an error for the last instantiation: template Test(alias symbol) { pragma(msg, symbol); } void main() { alias Test!(1) x; enum int en = 1; alias Test!(en) y; // ok, can be read at compile time int var; // error: variable var cannot be read at compile time alias Test!(var) z; }