Template constraints: opCmp and opUnary!"++"

monarch_dodra monarchdodra at gmail.com
Fri Dec 20 08:40:22 PST 2013


On Friday, 20 December 2013 at 15:38:56 UTC, Francesco Cattoglio
wrote:
> I'm trying to experiment a bit around the iota function.
> If I try to impose the following constraits:
>

>
> Everything works as it should, but according to "D Templates: A 
> Tutorial" book, you should not use arguments in constraints.

That's news to me.

> If I try doing something like:
>
> auto my_iota(B, E)(B begin, E end)
> if (is (typeof(++B.init)) && is (typeof(B.init < E.init))) {}
>
> the code stops compiling for integers.

That's normal, because "T.init" is not an lvalue.

If you need an lvalue, we have `std.traits.lvalueOf!T` which you
can use.

That said:

> auto my_iota(B, E)(B begin, E end)
> if (is (typeof(++begin)) && is (typeof(begin < end))) {}

Seems perfectly legit to me.

> On the other hand the code
>
> auto my_iota(B, E)(B begin, E end)
> if (is (typeof(++B)) && is (typeof(B < E))) {}
>
> fails to compile for both integers and my defined types.

"B" is a type, so "++B" will always resolve to "__error", unless
you've implemented a static operator (not sure if even legal?).


More information about the Digitalmars-d-learn mailing list