On 5/20/2016 6:47 AM, H. S. Teoh via Digitalmars-d-announce wrote:
Not to mention inconsistency in what exactly is being tested for: if you want to check if something is an input range, do you use is(typeof(R.empty)), etc., or should you use __traits(compiles, R.init.empty), or is it is(typeof((R r){r.empty;})), or any of the 15 or so slightly different ways of testing for the existence and type of some aggregate member, all subtly different from each other? Subtly different as in, for instance, testing for is(typeof((){R r; bool x = r.empty;})) is different from is(typeof(R r){bool x = r.empty;}), because the former doesn't work with R that has parameters closing over a local scope, whereas the latter does.
That is not a problem with constraints, it's a result of a dozen people adding constraints in an uncoordinated manner. I.e. it's a library problem.
Whereas if D had concepts, it would have been a simple matter of defining the prototypical range with struct-like syntax and calling it a day.
That really isn't good enough. Constraints can address behavior and relationships, concepts do not.