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