Referencing an overloaded function

Artur Skawina art.08.09 at gmail.com
Sat Mar 24 10:07:38 PDT 2012


On 03/24/12 15:39, Mantis wrote:
> 24.03.2012 14:13, John написал:
>> Is there any way to refer to a specific function overload?
>>
>> For example:
>>
>> import std.stdio;
>> import std.traits;
>>
>> void foo() {}
>> void foo(int x) {}
>>
>> void main() {
>>     writeln(foo.mangleof);
>>     writeln(ParameterTypeTuple!(foo).stringof);
>> }
>>
>> Both of these statements always refer to the first matching function.  If I change the order of declarations for foo, the results change.
>>
>> Is there a way to reference the second overload in this example?
>>
>> I can use a function pointer with ParameterTypeTuple to get the correct result, but something like mangleof won't work, since that will return the mangle of the local function pointer instead of the original function.
>>
> 
> import std.stdio;
> import std.traits;
> 
> void foo() { writeln( "void" ); }
> void foo( int x ) { writeln( x ); }
> 
> template getOverload( alias func, A... ) {
>     void function(A) getOverload = &func;
> }
> 
> void main() {
>     writeln( getOverload!(foo, int).mangleof );
>     writeln( ParameterTypeTuple!(getOverload!(foo, int)).stringof );
>     getOverload!(foo, int)(42);
>     getOverload!(foo)();
> }
> 
> Will not hold for return types other than void, there may be some generic workaround (of course, you can pass return type as tempate parameter).

Something like

> auto getOverload(alias func, A...)(A a) {
>     typeof(foo(a)) function(A) getOverload = &func;
> }

would work.

The problem with that solution is however that .mangleof will return
the wrong name.

This:

>     foreach (f; __traits(getOverloads, __traits(parent, main), "foo")) {
>        static if (is(ParameterTypeTuple!f==TypeTuple!(int))) {
>           writeln(f.mangleof);
>           writeln(ParameterTypeTuple!(f).stringof);
>           //writeln(typeof(f).stringof);
>           //f(42);
>           //etc
>        }
>     }

will do the right thing when you need the original name of foo(int).

artur


More information about the Digitalmars-d-learn mailing list