On 3 September 2016 at 23:04, Andrei Alexandrescu via Digitalmars-d <digitalmars-d@puremagic.com> wrote: > On 9/3/16 1:24 PM, Walter Bright wrote: >> >> On 9/3/2016 3:12 AM, Walter Bright wrote: >>> >>> If you are still determined to use it, you can use: >>> >>> __traits(compiles, ...) >>> >>> like you would SFINAE in C++ to select which of the modules from the >>> argument >>> types selects a function that compiles. >> >> >> Eh, I realized it's simpler than that. Based on the code I already >> presented, each argument can be used to generate an import for its >> corresponding version of the function. Then, overloading rules apply and >> it works. Something like: >> >> Something like: >> >> void foo(T,U)(T t, U u) >> { >> alias func = ModuleOf!T.func; >> alias func = ModuleOf!U.func; >> >> func(t, u); >> } > > > This only works with the respective modules do define `func`. We need > something that conditionally plants the symbol depending on whether the > module defines it or not. -- Andrei
Right, and it also has to not conflict with possible local definitions, or instances supplied by imports in the local namespace. Ie, the module where T came from is *an additional* place to look, not *the* place to look. I expect that local definitions may exist for things like generic fallbacks, or primitive/builtin type implementations.