Extend the call site default argument expansion mechanism?

Steven Schveighoffer schveiguy at yahoo.com
Tue May 15 13:16:21 UTC 2018


On 5/15/18 7:53 AM, Yuxuan Shui wrote:
> On Friday, 11 May 2018 at 18:55:03 UTC, Meta wrote:
>> On Friday, 11 May 2018 at 15:03:41 UTC, Uknown wrote:
>>> [...]
>>
>> 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);
>>     }
>> }
> 
> I found another alternative to this:
> 
> https://godbolt.org/g/3Etims

Hm... neat idea. Somehow, opDispatch can probably be used to make this 
work even more generically (untested):

struct WithAlloc(alias alloc)
{
    auto opDispatch(string s, Args...)(auto ref Args args) if 
(__traits(compiles, mixin(s ~ "(args, alloc)")))
    {
       mixin("return " ~ s ~ "(args, alloc);");
    }
}

-Steve


More information about the Digitalmars-d mailing list