On Saturday, 19 March 2022 at 15:58:25 UTC, Ali Çehreli wrote:
I wrote a chapter about the is expression but it's still
mysterious to me. :)
ddili.org/ders/d.en/is_expr.html
Thanks for the reply. I think I choose the wrong book. I knew
about your book but I thought this one is specially written for
templates. I will read the template chapters in **`Programming in
D`**.
It means "if T matches U[] and U is a type". "a type" because
it is just U in the is expression list.
So as per the eponymous trick, **`enum size_t rank`** will be
executed directly. Right ? But in that case, **`rank`** template
doesn't take a parameter. There is only the type parameter which
is **`T`**. So I am still in confusion about **`U`**.
I believe at least some of the traits have been added since
that doc document was written. I would write it in a much
simpler way using template constraints today:
```d
template rank(T) {
import std.traits : isArray;
import std.range : ElementType;
static if (isArray!T) {
enum size_t rank = 1 + rank!(ElementType!T);
} else {
enum size_t rank = 0;
}
}
```
This template is very easy to understand and I have no confusions
about it. Because, it only takes **`T`** as type parameter and
there is no magical **`U`**.
However, note how the template constraints had to be repeated
as isArray!T and !isArray!T in that case.
Yeah, I noted.
Not at all! The is expression is the weirdest part of D.
Oh I see.