Is there a "nice" way to access the names of template parameters outside?

Lukas Borin borin.lukas at gmail.com
Tue Jul 27 08:15:12 UTC 2021


Consider the following template

```D
auto foo(T, int W, int H)(T p1, T p2) { }
```

Is there a "nice" way from the outside the get the names of the 
template values?

E.g:
```D
pragma(msg, TemplateParameterNames!(foo)); // AliasSeq!("T", "W", 
"H") or ["T", "W", "H"]
```

I know you can find the names values in a very hacky way. 
(atleast in dmd 2.097.1)

```D
template HackyHack(alias T) {
    enum RawName = T.stringof;
    enum HackyHack = parseRawName(RawName); // Or 
templateParse!RawString;
}

```

I currently have the HackyHack solution *"working"* but I really 
don't like it and I would be supprised if it works on other dmd 
version or other compilers.


I know I can do things like:

```D
template foo(T, int W, int H) {
    enum names = ... // some magic with __traits or just assing it 
to ["T", "W", "H"]
    auto foo(T p1, T p2) { }
}
```

Use template mixins or other solutions to get what I want but if 
possible I prefer to just introspect on the template.

Usecase right now is to do some cuda kernel generation from a D 
shortfunction.

Something like this:

```D
@kernel
auto saxpy(T, int Iters, int N, int Stride)(T a, T* x, T* y, T* 
output) => q{
     int tid = blockIdx.x * blockDim.x + threadIdx.x;
     for(int idx = tid, int i = 0; i < Iters && idx < N; ++i, idx 
+= Stride) {
         output[idx] = a * x[idx] + y[idx];
     }
};
```

Would get transformed to:
```D
template<typename T, int Iters, int N, int Stride>
__global__ void saxpy(T a, T* x, T* y, T* output) {
     //Identical function body / parameters and template arguments 
from the @kernel
     //D function.
     int tid = blockIdx.x * blockDim.x + threadIdx.x;
     for(int idx = tid, int i = 0; i < Iters && idx < N; ++i, idx 
+= Stride) {
         output[idx] = a * x[idx] + y[idx];
     }
}
```

Really need the names to make this translation, correctly.

Just to be clear i'm not interested in getting the arguments a 
template was instantiated with. I can use TemplateArgsOf!T for 
that.


More information about the Digitalmars-d-learn mailing list