On Thu, Sep 13, 2018 at 06:32:54PM -0400, Nick Sabalausky (Abscissa) via Digitalmars-d wrote: > On 09/11/2018 09:06 AM, Steven Schveighoffer wrote: > > > > Then I found the true culprit was isForwardRange!R. This led me to > > requestion my sanity, and finally realized I forgot the empty > > function. > > This is one reason template-based interfaces like ranges should be > required to declare themselves as deliberately implementing said > interface. Sure, we can tell people they should always `static > assert(isForwardRage!MyType)`, but that's coding by convention and > clearly isn't always going to happen.
Yeah, I find myself writing `static assert(isInputRange!MyType)` all the time these days, because you just never can be too sure you didn't screw up and cause things to mysteriously fail, even though they shouldn't. Although I used to be a supporter of free-form sig constraints (and still am to some extent) and a hater of Concepts like in C++, more and more I'm beginning to realize the wisdom of Concepts rather than free-for-all ducktyping. It's one of those things that work well in small programs and fast, one-shot projects, but don't generalize so well as you scale up to larger and larger projects. T -- A program should be written to model the concepts of the task it performs rather than the physical world or a process because this maximizes the potential for it to be applied to tasks that are conceptually similar and, more important, to tasks that have not yet been conceived. -- Michael B. Allen