[Issue 24080] New: std.traits.TemplateOf doesn't return void for non-template functions
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Aug 10 21:00:11 UTC 2023
https://issues.dlang.org/show_bug.cgi?id=24080
Issue ID: 24080
Summary: std.traits.TemplateOf doesn't return void for
non-template functions
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: enhancement
Priority: P1
Component: phobos
Assignee: nobody at puremagic.com
Reporter: schveiguy at gmail.com
std.traits.TemplateOf resolves to `void` on non-template types. However, it
fails to compile on non-template functions:
```d
struct S {}
void foo() {}
pragma(msg, TemplateOf!S); // void
pragma(msg, TemplateOf!foo); // error
```
The reason is because the `TemplateOf` overloads only include a catch-all for
types:
```d
alias TemplateOf(T) = void;
```
If we change the parameter to an `alias`, it works for both types and
functions.
I believe the reason this wasn't "solved" before might be because of the
problem with passing basic types to alias parameters. However, this has been
solved since 2.087:
https://dlang.org/changelog/2.087.0.html#template_alias_matches_basic_types
In fact, I think we can remove the overload that specifically matches template
types as well, and just have two aliases:
```d
alias TemplateOf(alias T : Base!Args, alias Base, Args...) = Base;
alias TemplateOf(alias T) = void;
```
--
More information about the Digitalmars-d-bugs
mailing list