Should std.range.primitives.ElementType have sig constraints?
Jonathan M Davis via Digitalmars-d
digitalmars-d at puremagic.com
Wed Jan 20 12:26:27 PST 2016
On Wednesday, 20 January 2016 at 18:54:34 UTC, H. S. Teoh wrote:
> Currently, std.range.primitives.ElementType has no sig
> constraints, so it will pick up all sorts of things that aren't
> ranges. This is not so nice, because ranges aren't the only
> thing that have elements, and it would be nice if such a good
> name as ElementType could be reused for other user-defined
> generic constructs.
>
> For example, I wrote some generic code for working with 2D
> scalar
> fields (i.e., arbitrary objects that define
> opIndex(double,double)), and
> defined an ElementType template specific to fields:
>
> template ElementType(F)
> if (is2DField!F)
> {
> alias ElementType = typeof(F.init[0.0, 0.0]);
> }
>
> However, this causes a conflict wherever I import std.range,
> since std.range.primitives.ElementType matches *everything*,
> including 2D field objects that have no resemblance whatsoever
> to ranges, only to return `void`. Shouldn't ElementType be
> constrained to only those types that it understands?
>
> I dug through the git history, and it seems that ElementType
> has always been defined this way, ever since Andrei first
> committed the implementation of range primitives. The original
> docs did not mention anything about picking up all types; that
> comment (part of the current docs) was added much later by
> someone else.
>
> What was the rationale for having no sig constraints for
> ElementType? Was it an oversight? Doesn't seem like it, since
> it explicitly returns `void` for non-range types. What's the
> purpose of that? Would it be acceptable to modify the
> definition of ElementType to:
>
> template ElementType(R)
> if (isInputRange!R)
> { ... }
I'm not sure that I'd consider it a good idea to reuse the name
ElementType elsewhere given how pervasive
std.range.primitives.ElementType is in code, but I don't see any
reason why it shouldn't have a template constraint on it, and if
it does, the module system would allow you to reuse the name. But
even if we all agreed that reusing the name was a bad idea, the
error messages when ElementType was misused would definitely be
better if it had a template constraint no it.
So, I see no problem with adding a constraint.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list