On Thursday, 22 September 2016 at 07:14:52 UTC, H. S. Teoh wrote:
It's not so simple. The UFCS operator overload could be
declared in a different module from the type itself. Then
there is no guarantee that it will be found. Multiple calls to
the same template function with the same argument types may
result in different semantics, depending on what was imported.
I mean (in terms of your example) that in `main` before
instantiate an `algorithm` we parse all symbols visible at this
point from `main`, select all possible symbols which can be
called with `UserType` (including templates, meh o_O), make the
set union for the such table for the rest templates params, and
give this symbol table the `algorithm`.
But yes this creates problem that in different module we can have
different instantiation :(
Probably with other radical approach (see bellow *) for generic
we can solve this, but this just destroy true templates (from
which we benefits now) and provide something like Java-like
* radical approach for generic: each generic function creates a
pseudo parameter for function pointers on the base of signature
of function used in the body of generic. The caller of generic
just fill this pseudo parameters with real function visible for
caller at call-point.