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