On 2012-04-10 21:45, H. S. Teoh wrote:
A lot of template code (e.g. a big part of Phobos) use signature
constraints, for example:
void put(T,R)(R range, T data) if (isOutputRange!R) { ... }
This is all nice and good, except that when the user accidentally calls
.put on a non-range, you get reams and reams of compiler errors
complaining that certain templates don't match, certain other
instantiations failed, etc., etc.. Which is very unfriendly for newbies
who don't speak dmd's dialect of encrypted Klingon. (And even for
seasoned Star Trek^W^W I mean, D fans, it can take quite a few seconds
before the real cause of the problem is located.)
Original I would have gone with something like:
struct OutputRange
{
void foo ();
void bar ();
}
void put(T,OutputRange R)(R range, T data)
Or:
void put(T,R : OutputRange)(R range, T data)
Something like that.
--
/Jacob Carlborg