Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
July 20, 2016 Why typeof(template) is void? | ||||
---|---|---|---|---|
| ||||
``` struct S(T) {} static assert(is (typeof(S) == void)); ``` Why S's type isn't something like `S: (T) -> S`? |
July 20, 2016 Re: Why typeof(template) is void? | ||||
---|---|---|---|---|
| ||||
Posted in reply to mogu | 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 Re: Why typeof(template) is void? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | 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 Re: Why typeof(template) is void? | ||||
---|---|---|---|---|
| ||||
Posted in reply to mogu | 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 Re: Why typeof(template) is void? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Lodovico Giaretta | 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
|
Copyright © 1999-2021 by the D Language Foundation