Extend the call site default argument expansion mechanism?

Meta jared771 at gmail.com
Fri May 11 18:55:03 UTC 2018


On Friday, 11 May 2018 at 15:03:41 UTC, Uknown wrote:
> I see what you're saying and I agree with you. I think a better 
> way would be to try and extend the `with` syntax to work with 
> arbitrary functions, rather than only objects. That would make 
> it more useful. So something like:
>
> ---
> void f1(allocator alloc, ...){}
> void f2(allocator alloc, ...){}
> ...
> void fn(allocator alloc, ...){}
>
> void main()
> {
>     with(MyAllocator) {
>         f1(...);
>         f2(...);
>         ...
>         fn(...);
>     }
> }
> ---

It's not as pretty, and I don't know if it works outside this toy 
example yet, but you can do:

import std.stdio;

struct Allocator
{
     auto call(alias F, Args...)(Args args)
     {
         return F(this, args);
     }

     void deallocateAll()
     {
         writeln("deallocateAll");
     }
}

void f1(Allocator a, int n) { writeln("f1"); }
void f2(Allocator, string s, double d) { writeln("f2"); }

void main()
{
     with (Allocator())
     {
         scope(exit) deallocateAll;
         call!f1(2);
         call!f2("asdf", 1.0);
     }
}


More information about the Digitalmars-d mailing list