That has the disadvantage of importing the whole std.range. I seriously doubt that we'd get anything better then:> import std.range.traits; > > void foo(R)(R range) if (isForwardRange!R) > { import std.range; ... > }Stays practical w.r.t. cutting down dependencies and no need to uglify constraints. They are not that readable already.
I think it was mostly agreed here that we should do both for best result.