ADL

Manu via Digitalmars-d digitalmars-d at puremagic.com
Sat Sep 3 09:01:45 PDT 2016


On 3 September 2016 at 23:04, Andrei Alexandrescu via Digitalmars-d
<digitalmars-d at 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.


More information about the Digitalmars-d mailing list