Interfaces, traits, concepts, and my idea for a DIP

Tofu Ninja via Digitalmars-d digitalmars-d at puremagic.com
Tue Jul 28 11:23:00 PDT 2015


On Tuesday, 28 July 2015 at 13:23:37 UTC, Daniel Kozák wrote:
>
> I was thinking about same many times before. With one 
> difference:
>
> instead of this:
> struct MyRange: isInputRange { ... }
>
> I would use something like this:
>
> @interface(InputRange, ...)
> struct MyRange { ... }
>
>
> @interface(InputRange, ...)
> class MyClassRange { ... }

I have actually thought about this as well, and a thing that 
could actually make this possible is if UDAs could get the thing 
they are attached to. I realized it could be done easily when I 
saw that this worked:

template someuda(alias attach) {}
@someuda!(x) int x;

someuda can even inspect x and see itself attached to it, pretty 
cool. Only thing that would be needed to make it seamless is a 
for a new default arg value identifier like __FILE__ that just 
translates to whatever the UDA is attached to. I would call it 
__UDA_ATTACHMENT__. So the above would be translated to:


template someuda(alias attach = __UDA_ATTACHMENT__) {}
@someuda!() int x;


The parens would sadly still be necessary, but then you could do:

import std.range.interfaces;

template StaticInterface(alias Iface, alias attach = 
__UDA_ATTACHMENT__)
      if(is(Iface == interface))
{
      // See if attach statically implements Iface
}

@StaticInterface!(InputRange)
struct someRange {...}




More information about the Digitalmars-d mailing list