On Tuesday, 4 February 2014 at 17:17:13 UTC, Adam D. Ruppe wrote:
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.

Ah great, thanks that makes perfect sense.

Reply via email to