Thread overview
Getting template parameters by its name
Jan 11, 2019
Yui Hosaka
Jan 11, 2019
Paul Backus
Jan 12, 2019
Yui Hosaka
January 11, 2019
I want to do something like this:

----
template S(T) {
}

void main() {
  pragma(msg, S!(int).T);  // Error: no property `T` for type `void`
}
----

Using alias, it is possible to get T by another name:

----
template S(T) {
  alias t = T;
}

void main() {
  pragma(msg, S!(int).t);
}
----

But the same identifier cannot be used:

----
template S(T) {
  alias T = T;  // Error: `alias T = T;` cannot alias itself, use a qualified name to create an overload set
}

void main() {
  pragma(msg, S!(int).T);
}
----

Is there any nice way that `S!(int).T` works?

January 11, 2019
On Friday, 11 January 2019 at 04:59:50 UTC, Yui Hosaka wrote:
> I want to do something like this:
>
> ----
> template S(T) {
> }
>
> void main() {
>   pragma(msg, S!(int).T);  // Error: no property `T` for type `void`
> }
> ----

You can get the arguments of a template instance as an AliasSeq using `std.traits.TemplateArgsOf`.

https://dlang.org/phobos/std_traits.html#TemplateArgsOf
January 12, 2019
On Friday, 11 January 2019 at 06:13:11 UTC, Paul Backus wrote:
> On Friday, 11 January 2019 at 04:59:50 UTC, Yui Hosaka wrote:
>> I want to do something like this:
>>
>> ----
>> template S(T) {
>> }
>>
>> void main() {
>>   pragma(msg, S!(int).T);  // Error: no property `T` for type `void`
>> }
>> ----
>
> You can get the arguments of a template instance as an AliasSeq using `std.traits.TemplateArgsOf`.
>
> https://dlang.org/phobos/std_traits.html#TemplateArgsOf

It seems a good choice to me. Thank you!