On 25/08/2012 23:12, David Piepgrass wrote:
So maybe we can do:

auto implementObject(Interface, T)(T t){...}
auto obj = implementObject!(InputRange!E)(range);

Well, my D-fu is too weak to tell whether it's doable. When it comes to
ranges, the standard library already knows what it's looking for, so I
expect the wrapping to be straightforward.

I was thinking things like __traits(allMembers, Interface) and other __traits might provide enough to do it.

Even if a template-based
solution could work at compile-time, run-time (when you want to cast
some unknown object to a known interface) may be a different story.

My code above does do that - range is unknown, it just has to have compatible symbols with Interface's methods. obj is a true Object that implements Interface. Continuing the example, you could write:

InputRange!E iface = obj;

Where InputRange!E is a real interface, not a model of one. I.e. you could pass it to a non-template function:

void foo(InputRange!E irange){...}
foo(obj);

I'm not sure what's missing (besides an implementation of course ;-)).

>> Also, it might be nice to have 'canImplement' for template constraints:
>>
>> auto foo(T)(T v) if (canImplement!(T, SomeInterface)){...}
>
> or 'couldImplement', assuming T doesn't officially declare that it
> implements the interface...

I was thinking 'can implement' vs. 'does implement'.

Reply via email to