On 8/3/12, Zhenya <[email protected]> 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;
}