Implementing interfaces using alias this

basile b. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jun 14 18:00:39 PDT 2017


On Wednesday, 14 June 2017 at 22:29:08 UTC, Balagopal Komarath 
wrote:
> On Wednesday, 14 June 2017 at 21:04:55 UTC, basile b. wrote:
>> The way to do that in D is with mixins:
>
> That is an interesting solution.
>
> However, my original goal was to figure out whether one can 
> make struct types behave polymorphically (Which is not 
> mentioned in my original question).  I know that this is not 
> supported by design. I want to keep the original struct types 
> but also allow functions to accept those struct types and do 
> runtime dispatch. The following code should give a better idea 
> by what I mean by this.
>
> https://dpaste.dzfl.pl/051f6a4da059
>
> The user need only define Duck1, Duck2 ... with appropriate 
> functions and mixin toDuck. Then a function that accepts a Duck 
> can accept DuckLike (for dynamic dispatch) or templatize on the 
> type of Duck.

Duck typing doesn't work with the pattern you used initially.
The pattern you used initially is much more similar to the 
solution i exposed.

The point is that "alias" cant do what you wished.
It's not in the language, end of story.

Finally duck types in D are more like this:

enum looksLikeaDuck(T) = __traits(hasMember, T, "quack");

class Test(T)
if (looksLikeaDuck!T)
{
     T data;
     alias data this;
}

struct Duck
{
     void quack()
     {
         import std.stdio;
         writeln("Quack");
     }
}

void main()
{
     Test!Duck d;
}

you use traits to verify that the template parameter looks like a 
duck.
It's not like in Swift where an aggregate is used.
In D we use traits (even if traits can be used to verify that a 
template parameter is compliant with the member of an aggregate).


More information about the Digitalmars-d-learn mailing list