typeof(func!0) != typeof(func!0())

Paul Backus snarwin at gmail.com
Mon Aug 22 16:42:50 UTC 2022


On Monday, 22 August 2022 at 16:19:06 UTC, Andrey Zherikov wrote:
> I have an impression that template function can be called 
> without parenthesis if it doesn't have run-time parameters so 
> `func!0` is the same as `func!0()`. Am I wrong?

You're not wrong. This behavior is a special case in `typeof`. I 
was merely attempting to explain why such a special case might 
have been introduced.

> If we consider free function vs. member function, why is 
> `typeof(u.func!0)` not the same as `typeof(u.func2!0)` here?

My guess is that `u.func2!0` is rewritten to `func2!0(u)` during 
semantic analysis, so it does not trigger the special-case 
behavior.

> Is `typeof(u.func2!0)` correct in this case? If so then I'll 
> just convert my API to free-standing functions and everything 
> will work as a magic (without my own implementation of 
> `getUDA`).

It's probably not worth completely changing your API design just 
to work around this issue. Also, even if you do this, it is still 
possible for a user to run into a same problem with a member 
function of one of their own types; for example:

```d
import your.library;

struct MyStruct {
     U myFunc() { /* ... */ }
}

@(MyStruct.myFunc) whatever;
```


More information about the Digitalmars-d-learn mailing list