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