template constraints when non-constrained template exists

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Mon Oct 5 01:26:02 PDT 2015


On Monday, 5 October 2015 at 08:14:14 UTC, Manu wrote:
> This comes up in many cases, I presume I've just missed 
> something really obvious...?

The obvious thing is to change it so that the template 
declaration in Phobos actually has a template constraint on it. 
But in general, these sorts of templates were not designed with 
the idea that they would be overloaded in user code. And to be 
honest, in this case, it could be a big problem if they were. 
These traits are used in code under the assumption that they only 
allow built-in types, and if you could overload them, then 
suddenly, that types would get past the template constraints on 
templates which were not designed to handle anything but built-in 
types. And at least some of the documentation is clear that they 
are intended for built-in types only. e.g. this is the ddoc 
comment on isUnsigned:

     Detect whether $(D T) is a built-in unsigned numeric type.

So, you could certainly declare your own isUnsigned and similar 
traits, but they're not going to overload with the ones in 
std.traits and thus would likely have to fully qualified. I 
suspect that that thwarts what you're trying to do, but I think 
that it's pretty clear that these traits were _not_ intended to 
be true for any user-defined type.

In general, the traits in std.traits are designed to match an 
exact set of built-in types and that's it. And code using them is 
going to rely on that, making overloading them very risky IMHO.

- Jonathan M Davis


More information about the Digitalmars-d mailing list