[Issue 19448] New: Add a trait to test template arguments without instantiation
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Nov 29 22:04:08 UTC 2018
https://issues.dlang.org/show_bug.cgi?id=19448
Issue ID: 19448
Summary: Add a trait to test template arguments without
instantiation
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: enhancement
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: elpenguino+D at gmail.com
Designing interfaces with the assumption that a template will compile if the
arguments match leads to silent failure. std.conv.text is one such offender. If
a templated toString exists for the type but causes compiler errors on
instantiation, text() will incorrectly fall back on some other method.
Example:
```
void main() {
writeln(X().text); //X(false)? That's not what I wanted!
}
struct X {
bool a;
void toString(T)(T sink) {
easilyMistypedMethod(sink);
}
void easilyMisspelledMethod(T)(T sink) {
put(sink, "Hello!");
}
}
```
I'd like to propose a simple trait to resolve this.
Example:
```
void x(T : int)() {
nonexistent();
}
static assert(!__traits(compiles, x!bool()));
static assert(__traits(templateMatches, x, int));
static assert(__traits(templateMatches, x, short));
static assert(!__traits(templateMatches, x, string));
void doSomething(alias T)() {
static if(__traits(templateMatches, T, int)) {
T!int();
}
}
static assert(!__traits(compiles, doSomething!x())); //x!int exists, but
doesn't compile, so this is expected
```
--
More information about the Digitalmars-d-bugs
mailing list