tardy v0.0.1 - Runtime polymorphism without inheritance

Atila Neves atila.neves at gmail.com
Fri Jun 19 12:44:26 UTC 2020


On Wednesday, 17 June 2020 at 16:01:29 UTC, Paul Backus wrote:
> On Tuesday, 16 June 2020 at 13:31:49 UTC, Atila Neves wrote:
>>
>> <snip>
>>
>> With a few changes, yes (added missing semicolons, changed 
>> IGeometry to Geometry in `measure`, passed the current module 
>> so tardy can find the UFCS functions, added `@safe pure` to 
>> the UFCS functions:
>>
> [...]
>>
>> void main() {
>>     auto r = Rect(3.0, 4.0);
>>     auto c = Circle(5.0);
>>
>>     Geometry.create!__MODULE__(r).measure;
>>     Geometry.create!__MODULE__(c).measure;
>> }
>
> IMO this can be done more elegantly by separating out the code 
> that looks up methods in the current module from the code that 
> does the actual type erasure.
>
> A while ago, I collaborated briefly with Adam Kowalski from the 
> Dlang discord server on some code to emulate C++-style 
> argument-dependent lookup in D. Using that code, your example 
> above would be written:
>
>     Geometry.create(r.extended).measure;
>     Geometry.create(c.extended).measure;


Interesting.

The issue I see here is you might not be able to control which 
module has the extension methods. I guess you could alias them in 
the module you want to use but that seems clumsy.

In any case, this is trivial:

template extended(string mod = __MODULE__) {
     auto extended(A...)(auto ref A args) {
         return create!mod(args);
     }
}



More information about the Digitalmars-d-announce mailing list