Thread overview
Why typeof(template) is void?
Jul 20, 2016
mogu
Jul 20, 2016
Adam D. Ruppe
Jul 20, 2016
mogu
Jul 20, 2016
Lodovico Giaretta
Jul 20, 2016
mogu
July 20, 2016
```
struct S(T) {}

static assert(is (typeof(S) == void));
```

Why S's type isn't something like `S: (T) -> S`?
July 20, 2016
On Wednesday, 20 July 2016 at 01:14:05 UTC, mogu wrote:
> Why S's type isn't something like `S: (T) -> S`?

Because S isn't a type... think of a template as being like a function that returns a type.

int foo(int) { return 0; }

There, you wouldn't expect typeof(foo) to be int, no, typeof(foo) is a function that returns an int.

The template is the same thing - it isn't a type, it is a template that returns a type.
July 20, 2016
On Wednesday, 20 July 2016 at 01:50:37 UTC, Adam D. Ruppe wrote:
> On Wednesday, 20 July 2016 at 01:14:05 UTC, mogu wrote:
>> Why S's type isn't something like `S: (T) -> S`?
>
> Because S isn't a type... think of a template as being like a function that returns a type.
>
> int foo(int) { return 0; }
>
> There, you wouldn't expect typeof(foo) to be int, no, typeof(foo) is a function that returns an int.
>
> The template is the same thing - it isn't a type, it is a template that returns a type.

So it's a higher kinded type aka type class in Haskell. But D's reflection cannot get enough information about template's kind. Only a `void` given. It may be inconvenient in distinction between an alias of template and void. The only solution AFAIK is by string of the type property .stringof.
July 20, 2016
On Wednesday, 20 July 2016 at 05:54:41 UTC, mogu wrote:
> On Wednesday, 20 July 2016 at 01:50:37 UTC, Adam D. Ruppe wrote:
>> On Wednesday, 20 July 2016 at 01:14:05 UTC, mogu wrote:
>>> Why S's type isn't something like `S: (T) -> S`?
>>
>> Because S isn't a type... think of a template as being like a function that returns a type.
>>
>> int foo(int) { return 0; }
>>
>> There, you wouldn't expect typeof(foo) to be int, no, typeof(foo) is a function that returns an int.
>>
>> The template is the same thing - it isn't a type, it is a template that returns a type.
>
> So it's a higher kinded type aka type class in Haskell. But D's reflection cannot get enough information about template's kind. Only a `void` given. It may be inconvenient in distinction between an alias of template and void. The only solution AFAIK is by string of the type property .stringof.

Note that void is a type, while S is not. So you can do:

assert(is(void)) // is(type) returns true
assert(!is(S))   // is(template) returns false;
July 20, 2016
On Wednesday, 20 July 2016 at 08:01:01 UTC, Lodovico Giaretta wrote:
> Note that void is a type, while S is not. So you can do:
>
> assert(is(void)) // is(type) returns true
> assert(!is(S))   // is(template) returns false;

Thanks very much. I should have noticed this before. T.T