Understanding isInfinite(Range)
Stanislav Blinov
stanislav.blinov at gmail.com
Mon Sep 6 14:02:11 PDT 2010
Andrej Mitrovic wrote:
> I'd love to see this used more in Phobos. I don't know if there are any drawbacks, but this looks and works nicely:
>
> import std.stdio : writeln;
>
> void main()
> {
> writeln(isInputRange!(N));
> }
>
> class N
> {
> N test;
>
> bool empty()
> {
> return false;
> }
>
> @property
> void popFront()
> {
> }
>
> @property
> N front()
> {
> return test;
> }
> }
>
>
> template isInputRange(R)
> {
> enum bool isInputRange = __traits(compiles,
> {
> R r; // can define a range object
> if (r.empty) {} // can test for empty
> r.popFront; // can invoke next
> auto h = r.front; // can get the front of the range
> });
> }
>
> If you uncomment some of those methods in class N, then you get back false, which is what you want. Currently isInputRange is defined like so in Phobos:
>
> template isInputRange(R)
> {
> enum bool isInputRange = is(typeof(
> {
> R r; // can define a range object
> if (r.empty) {} // can test for empty
> r.popFront; // can invoke next
> auto h = r.front; // can get the front of the range
> }()));
> }
>
> It's getting close to LISP! :)
>
If I remember correctly, it has been discussed not long ago that those
is(typeof(...))s should really be __traits(compiles). Maybe it's just
some code was written before those lovely __traits were introduced?..
More information about the Digitalmars-d-learn
mailing list