What does the alias attribute do here

Adam D. Ruppe destructionator at gmail.com
Tue Feb 4 09:17:12 PST 2014


On Tuesday, 4 February 2014 at 17:09:02 UTC, Gary Willoughby 
wrote:
> What does the alias attribute do here:
>
>     void foo(alias bar)

This specifically won't compile, alias params are only allowed in 
a compile-time list. So

void foo(alias bar)() { ... }

would work.


Anyway, what it does is you pass another symbol to the 
function/template and the alias parameter works as the same 
thing. So let's play with:

void foo(alias bar)() {
     import std.stdio;
     writeln(bar);
}

void main() {
     int a = 20;
     foo!a(); // will print 20
}


What happened is foo!a passed the /symbol/, not just the variable 
contents, the variable itself, as the alias parameter. An 
important difference between this and a regular int parameter is 
you can assign to it too:


void foo(alias a)() {
         import std.stdio;
         writeln(a);
         a = 50; // this is as if we literally wrote cool = 50; in 
main()
}

void main() {
         int cool = 20;
         foo!cool();
         assert(cool == 50); // passes
}


alias parameters differ from regular parameters because a regular 
parameter can only be a type name. An alias parameter can be 
another variable.


You can also pass it functions and call them as if the user wrote 
the call themselves - no pointers/delegates involved.


More information about the Digitalmars-d-learn mailing list