On 2016-09-03 13:16, Walter Bright wrote:
It's mostly about how
templates specify what interface they require and how the requirements
are
satisfied by the caller. ADL is a workaround for the lack of a
convenient enough
such protocol in templates. Other approaches to generics solve this
particular
issue quite elegantly. (E.g. type classes implicitly pass along the
required
free-function functionality.) D's templates don't, this is why it is a
template
issue.
By default, name lookup does not work in a way that would allow you to
actually
extend types using UFCS, and therefore none of Phobos works that way.
Lambdas!
So, something like this:
module foo;
struct Foo {}
int front(Foo f);
void popFront(Foo f);
bool empty(Foo f);
module algo;
void algorithm(alias front, alias popFront, alias empty, T)(T t);
module user;
import foo;
import algo;
void main()
{
Foo f;
algorithm!(() => f.front, () => f.popFront(), () => f.empty)(f);
}
--
/Jacob Carlborg