Understanding alias template parameters
    Ali Çehreli 
    acehreli at yahoo.com
       
    Thu Apr 21 21:38:14 UTC 2022
    
    
  
On 4/21/22 14:02, JG wrote:
 > Could someone possibly help me to understand why the commented line
 > doesn't compile?
   iota(10).myMap!(x=>2*x).writeln;
It is because x=>2*x is just a template. I don't know why the compiler 
chooses 'void' for typeof(f) but apparently that's how it represents the 
types of function templates.
One way of changing the code is to use the following but it does not 
really fit because of course you may want types other than 'int':
   (int x) => 2 * x  // Now the type is known
The more logical thing to do is to stay with alias template parameters 
for MapResult as well. I am not sure why you need the member 'f' so I 
commented it out but now it compiles after some trivial changes:
import std;
struct MapResult(R, alias f)  // <== HERE
{
     R r;
     // const F f;
     auto empty() { return r.empty; }
     auto front() { return f(r.front); }
     void popFront() { r.popFront; }
     auto save() { return typeof(this)(r.save); }
}
auto myMap(alias f, R)(R r) {
   pragma(msg, typeof(f));
     return MapResult!(R, f)(r);
}
void main()
{
    int function(int) f = x=>2*x;
    iota(10).myMap!f.writeln;
    iota(10).myMap!(x=>2*x).writeln;
}
Ali
    
    
More information about the Digitalmars-d-learn
mailing list