Interestingly, the discussion so far has been all about
syntax, not any
significant new features. I'm thinking ... coersion of a class
to any
compatible interface (as in Go)?
We already have:
import std.range;
auto range = ...;
auto obj = inputRangeObject(range);
alias ElementType!(typeof(range)) E;
InputRange!E iface = obj;
writeln(iface.front);
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. 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.
I am sometimes amazed by the things the Boost people come up
with, that support C++03, things that I was "sure" C++03 couldn't
do, such as lambda/inner functions (see "Boost Lambda Library",
"Boost.LocalFunction" and "Phoenix"), scope(exit)
(BOOST_SCOPE_EXIT), and a "typeof" operator (Boost.Typeof). If
there were 1/4 as many D programmers as C++ ones, I might be
amazed on a regular basis.
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...