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