On Wed, Feb 28, 2018 at 06:47:22PM +0100, Robert M. Münch via Digitalmars-d-learn wrote: > Hi, I'm lost reading some code: > > A a; > > auto do(alias f, A)(auto ref A _a){ > alias fun = unaryFun!f; > return ... > ... > } > > How is this alias stuff working? I mean what's the type of f? Is it an > anonymous function which then gets checked to be unary? How is it > recognized in the code using the function template?
Basically, the `alias f` is a catch-all template parameter that can bind to basically anything that has a symbol. It's typically used to bind to functions, delegates, and lambdas. Technically, the function is missing a sig constraint that verifies that f is in fact a unary function. So it will fail to compile if you pass something other than a unary function in. > This function can be called with code like this: > > a.do((myType) {...myCode...}); Are you sure the function name is 'do'? Because that's a keyword, and I don't think it's a valid identifier. > do(a, (myType) {...myCode...}); Are you sure this actually works? Is there another overload that takes a different parameter? The overload with `alias f`, AFAIK, can only be called with a compile-time parameter, like this: foo!((myType) { ... })(a); // or: a.foo!((myType) { ... }); > What's wondering me here is that the template function only has one > paraemter (_a) but I somehow can get my myCode into it. But the code > looks like a parameter to me. So why isn't it like: > > auto do(alias f, A)(auto ref A _a, ??? myCode){... > > I'm a bit confused. [...] Are you sure there isn't an overload that takes a second parameter? Doesn't look like this will compile, given the above declaration. T -- Food and laptops don't mix.