www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Getting template parameters by its name

reply Yui Hosaka <hos hos.ac> writes:
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?
Jan 10 2019
parent reply Paul Backus <snarwin gmail.com> writes:
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
Jan 10 2019
parent Yui Hosaka <hos hos.ac> writes:
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!
Jan 11 2019