Function aliasing problem

Jean-Louis Leroy jl at leroy.nyc
Tue Apr 21 21:24:56 UTC 2020


I can alias a function template:

     T f(T)(T x) { return x; }

     alias g = f;
     int a = g(42);

I can alias a static function:

     struct S
     {
       static int f(int i) { return i; }
     }

     alias sf = S.f;
     int b = sf(42);

I can alias to a static function in a template instance:

     struct SS(T)
     {
       static T f(T i) { return i; }
     }

     alias ssi = SS!int.f;
     int c = ssi(42);

Of course an alias can be templatized:

     alias SSS(T) = SS!T;

I would like to combine them all, e.g.:

     alias sst(T) = SS!T.f;
     int d = sst(42); // <=> SS!int.f(42)

But it fails like this:

     aliasstaticfunction.d(23): Error: template 
`aliasstaticfunction.sst` cannot deduce function from argument 
types `!()(int)`, candidates are:
     aliasstaticfunction.d(22):        `sst(T)`

In fact this simpler attempt fails in the same fashion:

     alias g2(X) = f!X;
     int e = g(42);

     aliasstaticfunction.d(25): Error: template 
`aliasstaticfunction.g2` cannot deduce function from argument 
types `!()(int)`, candidates are:
     aliasstaticfunction.d(24):        `g2(X)`

I tried with an eponymous template declaring an alias, in place 
of the alias template. Unsurprisingly, I get the same error (the 
latter is lowered to the former isn't it?).

I also tried std.meta.Alias, to no avail.

Is there a solution, other than building a templatized forwarder 
function, e.g.:

     T sst(T)(T i) { return SS!T.f(i); }
     int d = sst(42);

(and this is not good anyway, as it drops function attributes, 
parameter storage classes, UDAs etc).


More information about the Digitalmars-d-learn mailing list